记录使用Node.js下载zip文件但由于IDM的干扰不能正常下载的问题
异常
使用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压缩包文件了。
