无法在Node js中将文件作为附件下载

时间:2016-11-25 09:57:30

标签: javascript node.js express

我正在使用post和get方法在Node Js中下载文件时遇到问题。以下是我的代码

router.post('/download',function(req,res,next){
    var files=req.body;
    console.log(files[0]);
    var file_url = 'D:/Techh/Orginal/configR/uploads/'+files[0];
    console.log(file_url);
    res.redirect('/'+files[0]);
});

从客户端调用以上服务,稍后将其重定向到服务

app.get('/:file(*)', function(req, res, next){
    var file = '/'+req.params.file, path = 'D:/Techh/Orginal/configR/uploads' +file; 
    res.download(path);
});

但是我无法在浏览器中看到该文件被下载,而是我能够在浏览器控制台中看到如下图所示的响应

  

img

3 个答案:

答案 0 :(得分:0)

不要使用ajax,将提交用于iframe。我们可以在浏览器中看到文件下载

 <FORM action="http://example.com/script.php" 
       method="POST" target="hidden-form">
  <input type="hidden" name="filename" value="sdsfsfd"/>
</FORM>
<IFRAME style="display:none" name="hidden-form"></IFRAME>

此外,还有这样的事情

'D:/Techh/Orginal/configR/uploads/'+files[0];
如果有人尝试类似../../../../secretfile等等,那么

是非常危险的。之前清除路径:

var a = "../../../sdfsdf.txt"
a.substr(a.lastIndexOf("/")+1); // sdfsdf.txt

答案 1 :(得分:0)

据我了解您的意图,您希望在用户点击某些内容时基本上开始下载,而无需离开页面。 由于服务器将文件作为下载文件发送,因此您需要在客户端上执行的操作是

window.location.href = "/download/filename";

服务器应通过调用/download/:filename

来处理res.download()的GET

答案 2 :(得分:-1)

您是否尝试过设置标题?我无法在您的代码中看到它,因此我建议您在回复中设置内容类型。

请查看此处以便更好地了解响应标头: Node.js Documentation about response header

请参阅此问题解决方案以获取实施示例:

StackOverflow question about pdf file download using Node.js

编辑:还有一件事FYI,你得到的错误是因为浏览器正在获取一些数据并且它不知道如何处理它。您需要告诉他正在接收哪些数据,以便他知道如何处理它。这就是为什么你需要响应头,告诉浏览器正在传输什么数据。

希望它有所帮助。