下载具有文件名的NodeJS sendFile

时间:2017-01-30 17:18:18

标签: node.js sendfile

我尝试使用以下代码将文件发送到客户端:

router.get('/get/myfile', function (req, res, next) {
  res.sendFile("/other_file_name.dat");
});

它的工作正常,但是当用户从网址下载此文件时我需要这样做:

http://mynodejssite.com/get/myfile

浏览器中的文件名必须是“other_file_name.dat”而不是“myfile”。

4 个答案:

答案 0 :(得分:6)

这是我的解决方案:

var fs = require('fs');
var path = require('path');
const transfer = exports;

transfer.responseFile = function (basePath, fileName, res) {
    var fullFileName = path.join(basePath, fileName);

    fs.exists(fullFileName, function (exist) {
        if (exist) {
            var filename = path.basename(fullFileName);

            res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
            res.setHeader('Content-Transfer-Encoding', 'binary');
            res.setHeader('Content-Type', 'application/octet-stream');

            res.sendFile(fullFileName)
        } else {
            res.sendStatus(404);
        }
    });
};

并使用它:

router.get('/myfile', function (req, res) {
    transfer.responseFile("/var/nodejs", 'fileToDownload.dat', res);
});

感谢所有帮助者:)

答案 1 :(得分:3)

有专门的方法res.download

涵盖了所有人;)

router.get('/get/myfile', function (req, res) {
    res.download("/file_in_filesystem.dat", "name_in_browsers_downloads.dat");
});

答案 2 :(得分:1)

如果您有多条路线,如下所示: “/ get / myfile1”,“/ get / myfile2”,“/ get / myfile

你为什么不做一般的。它可以处理所有请求,它也将解决您的链接(download_name)问题。您可以按照以下方式进行操作

router.get('/get/:fileName',function(req,res){
    res.sendFile('/file_path/'+req.params.fileName)
});

评论后编辑(编辑1):

对不起,我没有明白你的观点。我假设如果你正在开发后端api,你应该控制选择网址,对吗?

举个例子:

当服务器端是这样的时候:

router.get('/get/:fileName',function(req,res){
    res.sendFile('/file_path/'+req.params.fileName)
});

根据您发布的代码和实施情况。需要下载的文件数量和已知文件都是有限的。

假设有2个文件:“file1.dat”和“file2.dat”

你可以在下面调用api吗?

  1. http://yourapi.com/get/file1.dat
  2. http://yourapi.com/get/file2.dat
  3. 我错过了什么吗?

    编辑2:

    如果是这种情况,我认为这可以解决您的问题,而不是使用sendFile使用res.attachment:

    app.get('/get/myfile',function(req,res){
            res.attachment('/file.txt');
            res.end('Downloaded', 'UTF-8')
    });
    

答案 3 :(得分:0)

这对我有用,以防对某人有用

res.sendFile('filepath', { headers: { 'filename': 'myfile' } }, (error) => errorHandlerFunc() )