如何用Fetch API获取图片并通过fs模块保存?Axios可行吗?
用Fetch/Axios实现图片+文本文件下载方案
你原来的函数只用res.text()处理内容,只能搞定文本文件。图片属于二进制数据,得换个方式处理——不管用Fetch还是Axios都能实现,下面是具体方案:
Fetch API改造方案
核心是针对图片改用res.blob()获取二进制数据,再转成Node.js的Buffer类型供文件写入:
async function fetchGithubFileContent(url) { // 从URL提取文件名,判断是否为图片 const fileName = url.split('/').pop(); const isImage = /\.(png|jpg|jpeg)$/i.test(fileName); const res = await fetch(url); let content; if (isImage) { // 获取图片二进制Blob,转成Buffer const blob = await res.blob(); content = Buffer.from(await blob.arrayBuffer()); } else { // 文本文件照旧用text()获取 content = await res.text(); } window.electronAPI.writeFile({ content, fileName }); } async function writeFile({ content, fileName }) { fs.writeFile(path.join(__dirname, fileName), content, (err) => { if (err) throw err; console.log(`successfully saved ${fileName}`); }); } // 测试图片下载 fetchGithubFileContent("https://example.com/your-test-image.png"); // 原文本文件下载不受影响 fetchGithubFileContent("https://raw.githubusercontent.com/Tetrax-10/Nord-Spotify/master/src/nord.js");
关键改动
- 增加图片判断逻辑,通过扩展名识别png/jpg文件
- 图片请求用
blob()获取二进制数据,再转成Buffer(因为Electron主进程的fs.writeFile支持直接写入Buffer) - 文本文件保持原有逻辑,不影响之前的功能
Axios实现方案
Axios同样可行,只需要设置对应的responseType,代码更简洁:
const axios = require('axios'); async function fetchGithubFileContent(url) { const fileName = url.split('/').pop(); const isImage = /\.(png|jpg|jpeg)$/i.test(fileName); const response = await axios.get(url, { // 图片用arraybuffer,文本用text responseType: isImage ? 'arraybuffer' : 'text' }); let content = response.data; if (isImage) { content = Buffer.from(content); } window.electronAPI.writeFile({ content, fileName }); } async function writeFile({ content, fileName }) { fs.writeFile(path.join(__dirname, fileName), content, (err) => { if (err) throw err; console.log(`successfully saved ${fileName}`); }); } // 调用示例 fetchGithubFileContent("https://example.com/your-test-image.jpg");
额外优化建议
- 比扩展名判断更可靠的方式:用响应头的
Content-Type,比如res.headers.get('Content-Type').startsWith('image/'),避免扩展名不对的情况 - 确保Electron主进程中正确引入
fs和path模块,渲染进程通过IPC调用写入逻辑(你现有代码的window.electronAPI.writeFile已经是正确的IPC方式)
内容的提问来源于stack exchange,提问作者Raghavan Vidhyasagar
相关产品推荐
相关产品推荐

