记录使用Node.js下载zip文件但由于IDM的干扰不能正常下载的问题

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录使用Node.js下载zip文件但由于IDM的干扰不能正常下载的问题相关的知识,希望对你有一定的参考价值。

异常

使用node.js来下载文件,可以下载非.zip类型的文件,但下载.zip类型的文件总是失败。

下载.zip格式的压缩文件,会被IDM捕获

在浏览器的网络面板查看,发现返回状态是204Intercepted by the IDM Advanced Integration,并且响应头并没有我们设置的'Content-TypeContent-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压缩包文件了。

以上是关于记录使用Node.js下载zip文件但由于IDM的干扰不能正常下载的问题的主要内容,如果未能解决你的问题,请参考以下文章

Windows下mysql-5.7.28下载安装配置教程

如何在 zip 文件归档器中创建文件夹 - node.js

Node.js的安装与配置

Node.js包之archiver压缩打包文件或目录为zip格式

利用IDM实现百度云满速下载

利用IDM工具下载ESA上的Sentinel数据