2026-01-13 17:23:28 +01:00

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)
}
}