下载中带有文件名的NodeJS sendFile
NodeJS sendFile with File Name in download
我尝试使用此代码向客户端发送文件:
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"。
如果您有如下多条路线:
"/get/myfile1", "/get/myfile2", "/get/myfile
你为什么不做一个通用的。它可以处理所有请求,它也将解决您的 link(download_name) 问题。您可以按如下方式进行
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吗?
我是不是漏了什么?
编辑 2:
如果是这样,我认为这会解决您的问题,而不是使用 sendFile 使用 res.attachment:
app.get('/get/myfile',function(req,res){
res.attachment('/file.txt');
res.end('Downloaded', 'UTF-8')
});
这是我的解决方案:
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);
});
感谢所有帮助者:)
有专门的方法res.download
涵盖所有内容;)
router.get('/get/myfile', function (req, res) {
res.download("/file_in_filesystem.dat", "name_in_browsers_downloads.dat");
});
这对我有用,以防对某人有用
res.sendFile('filepath', { headers: { 'filename': 'myfile' } }, (error) => errorHandlerFunc() )
我尝试使用此代码向客户端发送文件:
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"。
如果您有如下多条路线: "/get/myfile1", "/get/myfile2", "/get/myfile
你为什么不做一个通用的。它可以处理所有请求,它也将解决您的 link(download_name) 问题。您可以按如下方式进行
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吗?
我是不是漏了什么?
编辑 2:
如果是这样,我认为这会解决您的问题,而不是使用 sendFile 使用 res.attachment:
app.get('/get/myfile',function(req,res){
res.attachment('/file.txt');
res.end('Downloaded', 'UTF-8')
});
这是我的解决方案:
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);
});
感谢所有帮助者:)
有专门的方法res.download
涵盖所有内容;)
router.get('/get/myfile', function (req, res) {
res.download("/file_in_filesystem.dat", "name_in_browsers_downloads.dat");
});
这对我有用,以防对某人有用
res.sendFile('filepath', { headers: { 'filename': 'myfile' } }, (error) => errorHandlerFunc() )