You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:58:25