Node.js中用Multer和FS上传时如何修改目录与文件名?
搞定Multer上传目录与自定义文件名的问题
嘿,我来帮你解决这两个小问题!你现在遇到的情况是因为没给Multer指定存储目录,所以它默认把文件存在了当前运行脚本的routes文件夹里,咱们一步步改过来:
一、把文件存到uploads文件夹
首先得确保你的项目根目录下有uploads文件夹(没有的话手动建一个,或者用代码自动创建也行)。然后在配置Multer的时候,通过diskStorage的destination选项指定存储路径就行:
const multer = require('multer'); const path = require('path'); const fs = require('fs'); // 先确定uploads的绝对路径,__dirname是当前routes文件夹的路径,../uploads就是回到根目录下的uploads const uploadDir = path.resolve(__dirname, '../uploads'); // 自动创建uploads目录(如果不存在的话) if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }); // recursive允许创建多级目录,不用怕父目录不存在 } // 配置Multer的存储规则 const storage = multer.diskStorage({ // 指定存储目录 destination: (req, file, cb) => { cb(null, uploadDir); }, // 下面是处理文件名的部分,接着看第二个问题 filename: (req, file, cb) => { // 这里先留空,后面讲自定义文件名 } }); // 创建Multer实例 const upload = multer({ storage: storage }); // 然后在你的路由里用这个upload实例就行 app.post('/upload', upload.single('your-file-field-name'), (req, res) => { res.send('上传成功啦!'); });
二、把文件名改成username.jpg的格式
要实现这个,就在刚才的filename回调里做文章就行。核心是拿到用户名,再拼接原文件的扩展名:
// 把刚才的filename回调补上 filename: (req, file, cb) => { // 这里要根据你的实际情况获取用户名: // 如果是登录用户,可能从req.user.username拿(比如用了passport或者jwt认证) // 如果是前端传过来的,就从req.body.username拿(前提是前端在FormData里传了这个字段) const username = req.body.username; // 举个例子,你按需调整 // 获取原文件的扩展名,比如.jpg、.png const fileExt = path.extname(file.originalname); // 拼接成你想要的格式:username + 扩展名 cb(null, `${username}${fileExt}`); }
几个要注意的小细节
- 路径别写错:如果你的routes文件夹在src目录下,那
../uploads可能不够,得用../../uploads,用path.resolve能帮你生成绝对路径,避免出错。 - 避免文件覆盖:如果有重名的用户,后面的上传会覆盖前面的文件,要是担心这个,可以加个时间戳,比如
${username}-${Date.now()}${fileExt}。 - 前端要传对参数:如果用户名是从前端传的,记得在FormData里同时放文件和用户名,比如:
// 前端示例代码 const formData = new FormData(); formData.append('your-file-field-name', document.getElementById('file-input').files[0]); formData.append('username', '你的用户名'); // 然后发请求 fetch('/upload', { method: 'POST', body: formData });
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

