NodeJS中如何为带账号密码验证的URL添加请求头实现文件下载
支持带认证的文件下载脚本修改方案
要让你的脚本支持访问受用户名密码保护的链接,最常用的方式是添加**HTTP基本认证(Basic Authentication)**请求头。以下是修改后的完整代码:
function download(url, dest, username, password) { const fs = require("fs"); const http = require("https"); const urlModule = require("url"); return new Promise((resolve, reject) => { const file = fs.createWriteStream(dest, { flags: "wx" }); // 解析URL并构建请求选项 const parsedUrl = urlModule.parse(url); const requestOptions = { hostname: parsedUrl.hostname, path: parsedUrl.path, headers: {} }; // 如果提供了账号密码,添加Basic Auth头 if (username && password) { const auth = Buffer.from(`${username}:${password}`).toString("base64"); requestOptions.headers.Authorization = `Basic ${auth}`; } const request = http.get(requestOptions, response => { if (response.statusCode === 200) { response.pipe(file); } else { file.close(); fs.unlink(dest, () => {}); // 删除临时文件 reject(`服务器响应状态码:${response.statusCode},信息:${response.statusMessage}`); } }); request.on("error", err => { file.close(); fs.unlink(dest, () => {}); // 删除临时文件 reject(err.message); }); file.on("finish", () => { resolve(); }); file.on("error", err => { file.close(); if (err.code === "EEXIST") { reject("文件已存在"); } else { fs.unlink(dest, () => {}); // 删除临时文件 reject(err.message); } }); }); }
关键修改说明
- 新增
urlModule模块解析URL,将原URL拆分为请求所需的主机名、路径等参数。 - 添加
username和password作为函数可选参数,传入后自动生成Basic Auth认证头:- 拼接
username:password为字符串 - 用
Buffer.from()将字符串转换为Base64编码 - 将编码结果放入
Authorization请求头,格式为Basic [Base64编码串]
- 拼接
- 把原
http.get(url, ...)改为使用requestOptions对象发起请求,确保认证头被正确携带。
使用示例
调用时只需额外传入用户名和密码即可:
download( "https://example.com/protected/file.zip", "./local/file.zip", "your-username", "your-password" ) .then(() => console.log("下载完成")) .catch(err => console.error("下载失败:", err));
内容的提问来源于stack exchange,提问作者Emrik Ahlström
相关产品推荐
相关产品推荐

