NextJS+formidable文件上传:filepath获取返回undefined问题求助
问题解决:formidable获取文件时filepath返回undefined
问题根源
从你的日志输出{ fields: {}, files: { resume: [ [PersistentFile] ] } }可以明确,data.files.resume是一个嵌套数组,而非直接的PersistentFile对象。数组本身没有filepath属性,所以直接访问resume.filepath会返回undefined。
解决方法
1. 正确访问嵌套数组中的文件对象
直接通过数组索引获取到内部的PersistentFile实例,再访问filepath:
console.log(data.files.resume[0][0].filepath); // 正常输出文件路径
如果要更稳妥(避免数组为空的情况),可以加一层判断:
const resumeFileArray = data.files.resume; if (resumeFileArray?.length > 0 && resumeFileArray[0]?.length > 0) { const filePath = resumeFileArray[0][0].filepath; console.log(filePath); // 后续上传文件到存储系统的逻辑 }
2. 调整formidable配置避免嵌套数组
如果确定前端只会提交单个文件,可以在初始化IncomingForm时设置multiples: false,强制解析为单个文件对象而非数组:
const form = new IncomingForm({ multiples: false });
修改后,data.files.resume会直接是PersistentFile对象,此时可以正常访问data.files.resume.filepath。
修改后的完整API代码示例
import type { NextApiRequest, NextApiResponse } from "next"; import { IncomingForm } from "formidable"; export const config = { api: { bodyParser: false, }, }; export default async function handler( req: NextApiRequest, res: NextApiResponse ) { if (req.method !== "POST") { return res.status(405).json({ message: "Method Not Allowed" }); } const data = await new Promise((resolve, reject) => { // 可选:添加multiples: false配置 const form = new IncomingForm({ multiples: false }); form.parse(req, (err, fields, files) => { if (err) return reject(err); resolve({ fields, files }); }); }); console.log("------"); console.log(data); console.log("------"); // 根据配置选择访问方式 const filePath = data.files.resume.filepath; // 当multiples: false时可用 // 或者用数组方式:const filePath = data.files.resume[0][0].filepath; console.log(filePath); res.status(200).json({ filePath, ...data }); }
内容的提问来源于stack exchange,提问作者user12858805
相关产品推荐
相关产品推荐

