如果路由参数匹配文件名如何从目录发送文件?

我有一个目录./Logs我从服务器logging文件,也显示给客户端的所有文件名,现在每个文件都有从客户端的下载选项,所以当用户调用下载的方法我发送文件名作为参数的服务器路由和寻找文件在提供的path使用forEach在./Logs目录我能够得到来自客户端的文件名,并能够打印为data所以直到这里它的工作,现在我看到错误的path必须是绝对的,任何想法如何我可以发送匹配的文件到客户端下载?

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

错误

  throw new TypeError('path must be absolute or specify root to res.sendFile'); ^ 

您需要使用path.resolve来获取文件的绝对path,或者使用root选项指定一个起始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}); } 

你的path不是绝对的(ej: ./Logs/log1.txt不是和/my/path/to/Logs/log1.txt相同),因此是错误的。

为了让浏览res.setHeader对话框提示用户使用res.setHeaderContent-Disposition头。

 var root = path.resolve('./Logs'); /* ....... */ if(fileName === file){ data = file; res.setHeader('Content-Disposition', 'attachment; filename=' + data); res.sendFile(data, {root: root}); } 

为什么不使用静态中间件?

 app.use('/file', express.static('Logs')); 

然后URL将http://yoursite.com/file/somefile.txt映射到./Logs/somefile.txt