如果路由参数匹配文件名如何从目录发送文件?
我有一个目录./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.setHeader
和Content-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
- MongoDB-Express :: ENOTDIR:不是目录,… gssapi.js / package.json
- 使用摇篮如何在沙发数据库中创build新的数据库
- 处理node.jscallback的最佳实践
- 你能创build一个快速路由处理程序的所有动词,还没有处理程序的给定端点?
- 如何使用快速和连接闪光显示未刷新页面的闪光消息?
- Express – 使用curl添加JSON负载,导致parsing错误
- express.js压缩中间件不起作用
- Angular问题和“否”Access-Control-Allow-Origin'标题“ – 使用OAuth 2,Passport,Express和Node
- 在js文件中调用Express.js的函数