43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import type { NextApiRequest } from 'next'
|
|
import { IncomingForm, File as FormidableFile } from 'formidable'
|
|
import type { Files } from 'formidable'
|
|
import fs from 'fs'
|
|
import type { ParseResult, UploadedFile } from './types'
|
|
|
|
const MAX_FILE_SIZE = 50 * 1024 * 1024 // 50MB
|
|
|
|
export async function parseFileFromMultipartRequest(req: NextApiRequest): Promise<UploadedFile | null> {
|
|
const form = new IncomingForm({ maxFileSize: MAX_FILE_SIZE, keepExtensions: true })
|
|
const parseResult = await new Promise<ParseResult>((resolve, reject) => {
|
|
form.parse(req, (err, fields, files) => {
|
|
if (err) {
|
|
console.error('Formidable parse error:', err)
|
|
reject(err)
|
|
return
|
|
}
|
|
resolve({ fields, files })
|
|
})
|
|
})
|
|
return getFirstFile(parseResult.files, 'file')
|
|
}
|
|
|
|
function getFirstFile(files: Files, fieldName: string): FormidableFile | null {
|
|
const value = files[fieldName]
|
|
if (!value) {
|
|
return null
|
|
}
|
|
if (Array.isArray(value)) {
|
|
const first = value[0]
|
|
return first ?? null
|
|
}
|
|
return value
|
|
}
|
|
|
|
export function safeUnlink(filepath: string): void {
|
|
try {
|
|
fs.unlinkSync(filepath)
|
|
} catch (unlinkError) {
|
|
console.error('Error deleting temp file:', unlinkError)
|
|
}
|
|
}
|