如何在Node.js中通过单次服务调用完成文件上传与下载?
合并文件上传与下载为单次调用的Express接口
没问题,我来帮你把这两个独立的Express服务合并成一个接口,实现单次调用完成文件上传、处理后自动下载的需求。
核心思路
- 用同一个POST接口接收上传的文件
- 完成文件上传后执行你的业务处理逻辑(比如生成目标文件
myOutput.txt) - 直接在这个接口中返回下载响应,让客户端自动触发文件下载
合并后的完整代码
var express = require('express'); var fs = require('fs'); var formidable = require('formidable'); var router = express.Router(); // 合并后的上传+下载接口 router.post('/', function(req, res, next) { var form = new formidable.IncomingForm(); form.uploadDir = "./file"; form.keepExtensions = true; form.maxFileSize = 10*1024*1024; form.multiples = false; form.parse(req, function (err, fields, files) { // 先处理上传错误 if (err) { console.error('文件上传出错:', err); return res.status(500).send('上传失败'); } // 这里添加你的业务处理逻辑 // 比如:读取上传的文件,处理后生成 ./file/myOutput.txt // 示例:假设你已经完成处理,生成了目标文件 var outputFile = './file/myOutput.txt'; var downloadFileName = 'ENC.txt'; // 检查目标文件是否存在,再触发下载 fs.access(outputFile, fs.constants.F_OK, (accessErr) => { if (accessErr) { console.error('处理后的文件不存在:', accessErr); return res.status(500).send('文件处理失败'); } // 返回下载响应,客户端会自动触发下载 res.download(outputFile, downloadFileName, (downloadErr) => { if (downloadErr) { console.error('下载响应出错:', downloadErr); res.status(500).send('下载失败'); } // 可选:下载完成后可以删除临时上传的文件 // fs.unlink(files.uploadedFile.path, (unlinkErr) => { // if (unlinkErr) console.error('删除临时文件失败:', unlinkErr); // }); }); }); }); }); module.exports = router;
关键要点说明
- 接口类型保持POST:因为需要接收上传的文件,所以不能用GET。客户端发送POST请求上传文件后,服务器直接返回下载响应即可,浏览器/Postman会自动处理下载流程
- 完善错误处理:添加了上传错误、文件不存在、下载错误的捕获逻辑,避免服务意外崩溃
- 业务处理环节:你需要把自己的具体处理逻辑(比如加密、格式转换等)放在上传完成后的回调里,确保最终生成
myOutput.txt文件 - 临时文件清理:如果不需要保留上传的原始文件,可以在下载完成后用
fs.unlink删除,避免占用存储空间 - 修正原代码问题:去掉了重复的
var express = require('express');声明,消除冗余代码
内容的提问来源于stack exchange,提问作者varun b
相关产品推荐
相关产品推荐

