From 92798436b0de7dcc2f3b9cea2451bd9e8530a04c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E5=B0=8F=E5=A2=A8?= Date: Thu, 6 Feb 2025 02:10:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E4=B8=8B=E8=BD=BD=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- batch-download/README.md | 1 + batch-download/index.js | 53 ++++++++++++++++++++++ package-lock.json | 97 ++++++++++++++++++++++++++++++++++------ package.json | 1 + 4 files changed, 138 insertions(+), 14 deletions(-) create mode 100644 batch-download/README.md create mode 100644 batch-download/index.js diff --git a/batch-download/README.md b/batch-download/README.md new file mode 100644 index 0000000..ad1ee1b --- /dev/null +++ b/batch-download/README.md @@ -0,0 +1 @@ +# 文件批量下载工具 diff --git a/batch-download/index.js b/batch-download/index.js new file mode 100644 index 0000000..d4faed4 --- /dev/null +++ b/batch-download/index.js @@ -0,0 +1,53 @@ +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); + +// 示例图片 URL 数组 +const imageUrls = [ + // 'https://example.com/image1.jpg', + // 'https://example.com/image2.jpg', + // 'https://example.com/image3.jpg', +]; + +for (let i = 1; i <= 100; i++) { + imageUrls.push(`https://example.com/image${i}.jpg`) +} + +// 执行下载 +downloadImages(imageUrls); + +// 批量下载图片函数 +async function downloadImages(urls) { + for (const url of urls) { + // const imageName = path.basename(url); // 获取图片名称 + const imageName = (imageUrls.indexOf(url) + 1) + '.jpg'; // 图片名称递增 + const imagePath = path.join(__dirname, 'downloads', imageName); // 图片保存路径 + + try { + const response = await axios({ + method: 'get', + url: url, + responseType: 'stream', // 让 axios 直接返回图片流 + }); + + // 确保下载目录存在 + if (!fs.existsSync(path.dirname(imagePath))) { + fs.mkdirSync(path.dirname(imagePath), { recursive: true }); + } + + // 将图片流写入本地文件 + const writer = fs.createWriteStream(imagePath); + response.data.pipe(writer); + + writer.on('finish', () => { + console.log(`图片下载完成:${imageName}`); + }); + + writer.on('error', (err) => { + console.error(`下载图片失败:${imageName}`, err); + }); + } catch (err) { + console.error(`下载图片出错:${url}`, err); + } + } +} diff --git a/package-lock.json b/package-lock.json index f230206..82b24a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "axios": "^1.7.9", "chalk": "4.1.2", "cheerio": "^1.0.0-rc.12", "crypto": "^1.0.1", @@ -183,11 +184,28 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "version": "1.7.9", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", "dependencies": { - "follow-redirects": "^1.14.4" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, "node_modules/bcrypt-pbkdf": { @@ -855,9 +873,16 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1497,6 +1522,15 @@ "node": ">=12" } }, + "node_modules/NeteaseCloudMusicApi/node_modules/axios": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz", @@ -1766,6 +1800,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz", @@ -2650,11 +2690,25 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axios": { - "version": "0.24.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "version": "1.7.9", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "requires": { - "follow-redirects": "^1.14.4" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "bcrypt-pbkdf": { @@ -3186,9 +3240,9 @@ } }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" }, "forever-agent": { "version": "0.6.1", @@ -3686,6 +3740,16 @@ "safe-decode-uri-component": "^1.2.1", "tunnel": "^0.0.6", "yargs": "^17.1.1" + }, + "dependencies": { + "axios": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "requires": { + "follow-redirects": "^1.14.4" + } + } } }, "netmask": { @@ -3897,6 +3961,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz", diff --git a/package.json b/package.json index 78bb73c..edcca75 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "author": "coder-xiaomo", "license": "MIT", "dependencies": { + "axios": "^1.7.9", "chalk": "4.1.2", "cheerio": "^1.0.0-rc.12", "crypto": "^1.0.1",