如何用NodeJS+Postman实现文件上传后删除源目录文件(剪切效果)
实现文件上传后的剪切/粘贴效果(删除源文件)
嘿,刚好能帮你搞定这个需求!要实现上传后删除源临时文件,其实只需要借助Node.js内置的fs模块,配合你的现有代码做几处修改就行,下面一步步来:
第一步:引入文件系统模块
首先在你的文件顶部引入fs.promises(因为你用了async/await,用Promise版本的API更贴合你的异步代码风格):
const fs = require('fs').promises;
第二步:修改上传逻辑,确保文件移动完成后再删除源文件
你原来的代码里avatar.mv()是异步操作,但没有等待它完成就直接执行后续逻辑,这样可能导致源文件还没移动完就被删除,或者删除时机不对。我们需要用await等待移动完成,再调用删除方法。
另外,注意你要删除的是临时文件的路径,也就是req.files.avatar.tempFilePath(你代码里已经打印过这个路径,确认是对的),用fs.unlink()方法来删除文件。
修改后的完整代码如下:
// 引入fs模块 const fs = require('fs').promises; // Route for allows users to upload their profile pictures. app.post('/upload-profile', async(req,res) =>{ try { if(!req.files) { res.send({ status:false, message: 'No file Uploaded' }); } else { // Use the name of the input field to retrieve the uploaded file let avatar = req.files.avatar; console.log(req.files.avatar.tempFilePath); // 等待文件移动完成 await avatar.mv('./uploads/' + avatar.name); // 删除源临时文件 await fs.unlink(avatar.tempFilePath); //send response res.send({ status:true, message: 'File is uploaded succesfully', data: { name: avatar.name, mimetype:avatar.mimetype, size:avatar.size, path: './uploads/' + avatar.name // 这里改成目标路径,原来的path是临时文件路径,现在返回上传后的实际路径更合理 } }); } }catch (err) { res.status(500).send(err); } });
几个关键注意点:
- 确保
useTempFiles配置正确:你能拿到tempFilePath,说明你在配置express-fileupload时已经开启了useTempFiles: true,这个是必须的——如果没开,文件会存在内存里,就没有物理文件需要删除了。 - 错误处理可选优化:如果删除临时文件时出错(比如文件已经被系统自动清理),会被外层的
try/catch捕获返回500错误。你也可以给删除操作单独加try/catch,避免因为删除失败导致整个上传请求失败。 - 路径修正:原来的
data.path返回的是临时文件路径,上传完成后返回目标目录的路径,前端拿到的才是正确的文件访问路径。
这样修改后,上传文件就会实现真正的“剪切/粘贴”效果:文件从临时目录移动到你指定的./uploads目录,同时临时文件被删除。
内容的提问来源于stack exchange,提问作者AndroBack
相关产品推荐
相关产品推荐

