下载中带有文件名的NodeJS sendFile
Posted
技术标签:
【中文标题】下载中带有文件名的NodeJS sendFile【英文标题】:NodeJS sendFile with File Name in download 【发布时间】: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')? 我找到了解决方案。明天给大家分享一下。非常感谢 【参考方案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吗?
-
http://yourapi.com/get/file1.dat
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'); );以上是关于下载中带有文件名的NodeJS sendFile的主要内容,如果未能解决你的问题,请参考以下文章
从 expressJS (sendFile) 服务器下载文件到 VueJS,是不是返回损坏的文件?