Javascript 如果路由参数与文件名匹配,如何从目录发送文件?
我有一个目录./Logs,我在其中记录来自服务器的文件,并向客户端显示所有文件名,现在,每个文件都有来自客户端的下载选项,因此,当用户调用下载方法时,我将文件名作为param发送到服务器路由,并使用/Logs目录上的forEach在提供的路径中查找文件,我能够从客户端获得文件名,并能够打印为Javascript 如果路由参数与文件名匹配,如何从目录发送文件?,javascript,node.js,express,Javascript,Node.js,Express,我有一个目录./Logs,我在其中记录来自服务器的文件,并向客户端显示所有文件名,现在,每个文件都有来自客户端的下载选项,因此,当用户调用下载方法时,我将文件名作为param发送到服务器路由,并使用/Logs目录上的forEach在提供的路径中查找文件,我能够从客户端获得文件名,并能够打印为数据,因此,直到这里,它还在工作,现在我看到错误路径必须是绝对的,知道如何将匹配的文件发送到客户端进行下载吗 angularFactory.js getFile:function(file_name){
数据
,因此,直到这里,它还在工作,现在我看到错误路径必须是绝对的,知道如何将匹配的文件发送到客户端进行下载吗
angularFactory.js
getFile:function(file_name){
return $http.get("/file?file_name="+file_name);
}
app.js
app.get('/file', function (req, res) {
var dir = './ditLogs';
var root = path.resolve('./ditLogs');
var fileName = req.query.file_name;
var data;
fs.readdir(dir, function(err, items) {
items.forEach(function(file){
if(fileName === file){
data = file;
console.log('DATA',data);
res.setHeader('Content-Disposition', 'attachment; filename=' + data);
res.sendFile(data, {root: root});
// res.sendFile(path.resolve(dir + '/' + data));
// res.sendFile(data, {root: root});
console.log(data);
}
});
});
});
错误
为什么不直接使用静态中间件呢
app.use('/file', express.static('Logs'));
URL然后会映射到./Logs/somefile.txt,您需要使用它来获取文件的绝对路径或使用该选项指定起始路径
或
您的路径不是绝对路径(ej:/Logs/log1.txt
与/my/path/to/Logs/log1.txt
不同),因此出现错误
要使浏览器使用对话框提示用户,请使用res.setHeader
和内容配置
标题
var root = path.resolve('./Logs');
/* ....... */
if(fileName === file){
data = file;
res.setHeader('Content-Disposition', 'attachment; filename=' + data);
res.sendFile(data, {root: root});
}
Hussain没有提到他使用了express。他没有提到,但是使用app.get()和他的其他代码强烈暗示了这一点。@Paul我使用的是express,我添加了您提到的使用app.use的代码,但它在客户端抛出了404。您能在原始代码之后显示更新的代码吗?从您所写的内容来看,可能客户端仍在请求以前的URL模式。如果您使用的是Express,您可能应该将其添加为标记。这是从文件发送数据,我希望发送整个文件,以便用户可以从客户端下载,可能吗?@hussain在我的代码
数据中是一个带有文件名的字符串,就像你在代码中写的一样。res.sendFile(path)
中的第一个参数是一个文件路径,它包含一个类似于/my/path/to/Logs/log1.txt的文件名,而不是文件的内容。是的,我试过了,作为回应,我收到了文件的内容,而不是文件itself@hussain你的意思是你想让浏览器用保存对话框提示用户将文件存储在他的计算机中?是的,我根据你的代码编辑了我的问题,这里我混淆了dir vs path模块,所以我更改了变量,是,我希望浏览器提示用户保存文件。
if(fileName === file){
data = file;
console.log('DATA',data)
res.sendFile(path.resolve(path + '/' + data));
}
var root = path.resolve('./Logs');
/* ....... */
if(fileName === file){
data = file;
console.log('DATA',data)
res.sendFile(data, {root: root});
}
var root = path.resolve('./Logs');
/* ....... */
if(fileName === file){
data = file;
res.setHeader('Content-Disposition', 'attachment; filename=' + data);
res.sendFile(data, {root: root});
}