使用express-fileupload时req.files返回[object Object],无法保存原文件名
解决express-fileupload保存文件时文件名变成[object Object]的问题
嘿,我一眼就看出问题出在哪了!当你看到保存的文件名叫[object Object],本质是你直接把文件对象当成字符串拼接进路径里了——req.files.audiofile是一个包含文件信息的对象,不是原始文件名,直接拼的话JS会把它转成默认的对象字符串表示[object Object]。
核心问题点
你需要从文件对象里提取name属性,这个属性才是用户上传时的原始文件名。
修正后的完整代码
先补上你代码里遗漏的express-fileupload引入,再修正路径拼接逻辑:
var express = require('express') var app = express(); var fileUpload = require('express-fileupload'); // 之前的代码漏了这个require! var bodyParser = require('body-parser') // 初始化中间件 app.use(fileUpload()); app.use(bodyParser.urlencoded({ extended: true })); // 处理表单数据可选,但建议加上 app.post('/upload', function(req, res) { // 更严谨的判断:确保文件存在且是audiofile字段 if (!req.files || Object.keys(req.files).length === 0 || !req.files.audiofile) { return res.status(400).send('No files were uploaded.'); } // 获取文件对象 let audiofile = req.files.audiofile; // 拼接保存路径:用audiofile.name获取原始文件名 const saveDir = __dirname + '/uploads/'; const savePath = saveDir + audiofile.name; // 先确保uploads目录存在,避免报错 const fs = require('fs'); if (!fs.existsSync(saveDir)) { fs.mkdirSync(saveDir, { recursive: true }); } // 执行保存 audiofile.mv(savePath, function(err) { if (err) { return res.status(500).send('文件保存失败:' + err.message); } res.send(`文件上传成功!原始文件名:${audiofile.name}`); }); }); // 启动服务 app.listen(3000, () => { console.log('服务器运行在3000端口'); });
额外优化建议
- 如果担心同名文件覆盖,可以给文件名加个时间戳前缀:
const fileName = `${Date.now()}-${audiofile.name}`; const savePath = saveDir + fileName; - 记得先安装依赖:
npm install express express-fileupload body-parser
内容的提问来源于stack exchange,提问作者pploypiti
相关产品推荐
相关产品推荐

