【问题标题】:NodeJS sendFile with File Name in download下载中带有文件名的NodeJS sendFile
【发布时间】:2017-06-15 22:53:20
【问题描述】:

我尝试使用此代码向客户端发送文件:

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

它工作正常,但当用户从 url 下载此文件时我需要它:

http://mynodejssite.com/get/myfile

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

【问题讨论】:

  • 您是否有其他与该端点签名匹配的路由?比如:router.get('/get/:filename', (req, res) => {})
  • 是的,我已经“/get/myfile1”、“/get/myfile2”、“/get/myfile...”
  • 您是否使用冒号在任何地方创建路由参数?在显示其他的之前,您是否也只有一个 router.get('/get')?
  • 我找到了解决方案。明天给大家分享一下。非常感谢

标签: node.js express sendfile


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    有一个专门的方法res.download

    它涵盖了你的一切;)

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

    【讨论】:

      【解决方案3】:

      这是我的解决方案:

      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);
      });
      

      感谢所有帮助者:)

      【讨论】:

        【解决方案4】:

        如果您有多个路线,如下所示: "/get/myfile1", "/get/myfile2", "/get/myfile

        你为什么不做一个通用的。它可以处理所有请求,它也将解决您的链接(下载名称)问题。你可以这样做

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

        评论后编辑(编辑 1):

        对不起,我没明白你的意思。我假设如果您正在开发后端 api,您也应该可以控制选择 url,对吧?

        举个例子:

        当服务器端是这样的:

        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

        我错过了什么吗?

        编辑 2:

        如果是这样,我认为这会解决您的问题,而不是使用 sendFile 使用 res.attachment:

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

        【讨论】:

        • 这是一个很好的解决方案,但问题是原始文件名与 url 不同。
        • 对不起,我没明白你的意思。我假设如果您正在开发后端 api,您也应该可以控制选择 url,对吗?举个例子:当服务器端是这样的: router.get('/get/:fileName',function(req,res){ res.sendFile('/file_path/'+req.params.fileName) });根据您发布的代码和实现。需要下载的文件数量有限且已知文件。假设有 2 个文件:“file1.dat”和“file2.dat”,您可以如下调用 api 吗? 1. yourapi.com/get/file1.dat 2. yourapi.com/get/file2.dat
        • 不行,url需要不带文件名和扩展名。
        • 如果 Edit 2 解决了您的问题,请告诉我
        • app.get('/get/myfile',function(req,res){ res.attachment('/file.txt'); res.send('/file.txt'); });
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 2011-11-03
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        相关资源
        最近更新 更多