异常
使用node.js来下载文件,可以下载非.zip
类型的文件,但下载.zip
类型的文件总是失败。
下载.zip
格式的压缩文件,会被IDM捕获
在浏览器的网络面板查看,发现返回状态是204Intercepted by the IDM Advanced Integration
,并且响应头并没有我们设置的'Content-Type
和Content-Disposition
属性。
错误代码
var fs = require('fs');
var http = require("http");
var server = http.createServer();
server.on("request", function (request, response) {
// 获取请求URL
var url = request.url;
// 如果是下载文件的URL,则判断进行处理
if (url.startsWith('/download/')) {
// 提取文件名hello.txt
var name = url.substring(url.lastIndexOf('/') + 1);
console.log(name);
// 创建可读流,读取当前项目目录下的hello.txt文件
var rs = fs.createReadStream(__dirname + "//" + name);
// 设置响应请求头,200表示成功的状态码,headers表示设置的请求头
response.writeHead(200, {
'Content-Type': 'application/force-download',
'Content-Disposition': 'attachment; filename=' + name
});
// 将可读流传给响应对象response
rs.pipe(response);
}
});
server.listen(8888, function () {
console.log("服务器启动成功,可以通过 http://127.0.0.1:8888 来进行访问");
});
在浏览器地址栏输入http://127.0.0.1:8888/download/hello.txt
就可以下载当前项目目录下的hello.txt
文件,同样要下载hello.zip
文件只需要输入http://127.0.0.1:8888/download/hello.zip
即可。
原因
下载链接被IDM捕获了,所以该下载请求实际上是被正确处理了的,但是不是通过浏览器下载的。所以在浏览器的响应头看不到我们设置的下载文件的属性。
即使我退出IDM,它还是会自动捕获下载链接,进行下载,所以退出IDM是不能解决问题的。
解决
对IDM进行设置,让它不捕获浏览器的下载链接。打开IDM,选择下载
——>选项
取消指定浏览器的下载捕获。
再通过浏览器访问127.0.0.1:8888/download/hello.zip
就可以在浏览器下载zip压缩包文件了。