Postman中将Base64编码数据转为二进制并下载为文件的问题
解决Base64编码图片转本地PNG文件的问题
错误原因分析
你遇到的TypeError: fs.writeFileSync is not a function错误,本质是环境不兼容:
fs是Node.js专属的文件系统模块,**浏览器/前端自动化测试环境(如Cypress)**没有这个API,直接调用会报错- 如果是Node.js环境,大概率是没正确引入
fs模块
下面分场景给出可行解决方案:
方案1:Node.js环境(如Mocha/Jest自动化脚本)
直接用Node.js的Buffer和fs模块处理,无需先转Uint8Array,步骤更简洁:
const fs = require('fs'); const path = require('path'); // 替换为你的API返回的Base64数据 const base64EncodedData = 'iVBORw0KGgoAAAANSUhEUgAAAMsAAAAyCAYAAADyZi/iAAADsElEQVR42u2aMWgUQRSGwxVBJI2E4wiSJsgRJNiIpDhEBLGQKyRgIUFCEIJISGUnFiIBkRQpJK1YhECwSiGBIFcEsZEQgkgaEREJEpBDRIIcrG9gDsdxbnd2s7u3d34fPEKSebM7M++fffN2BwYAAAAAAAAAAAAAAKDXCCwyukZJ7JbYutgnsZ9irayvC38W4GLgoMfGsGbdvgqisQT9nNG+JqtFEIt0OS62H0RARGcXZCfFPvSBWIbFvlpD2E7Qz7bVh+pzuNtike6G9JMkQCzdC7Llfpl0ueUbjmHMx/BfcPhPFSENk+7uW91/FLsiNkgU5xNcNWPym/2wQ+lc3uS72KiH35jYD8v3RVHOLNJdw+r+MhGcX1CdsNKv230ilrLYoTWULQ+/Lcvnm1ilQGKxhVwiivMLqiVj4ht5VXNyGtu0I52aDWl/x9F+ukjVMCpe3QumSWPej9pVo6wWW7q6pqtVB2K/dLVpV+xR2OFZ/ld3+O2JPREbibjmhuNJMeJoN6pTNZONhOPsOH/GHDSNseyILUaNpZ82sl4TyqBVfryXxoK4fHVK9CqieKNSpktWXxWx1xF+KvivhtzPiG4TKgJH+tX0Cd4Yc6CqdJsRY1FirUf1RyUsf7E8NuZ2N63dy7Fup8Teea6xCpaqEeRfPP3U7jwRck+zDp+bxv9n4qRrCeZAlXvfeo5FPW0mEUtxhHLBmFeVA5/NUCzrxnuK+fZurZ9sMzq1Mmnot9M7+vcDT783MQ/uh3q3dz15No85vzar+udnfS4q63bq3dacoxCxh1iKk369N+Z1Mc28uMPa7bcDxNG+qs9Lf5VqE/rVQu7LdSZZc5xpVJvTKYsl0E/XTmM5bx/c1dcUnFm6L5aHVhAPZiyWf55cDp+nHfzGI/xWLJ+liPZzHpvy3RTm2JVaVSN8nlk+y4ilu0I5Z+1gtbQXxBEoax4+dVfqksDvpYdPWKGhkdI82zz38JnySQURSz5CKVkH7ZUsypNJPhPRRYA0/JoePq439IH+21hGYrnu4VP2GQtiyT/9UlWmoZzEUvEUchp+R5736Pr2ayHFuc5sLIgle6FMWOlXPc5iHydQcvZrZX29bo8FsWSffu3FPEP0qliCPhJLgFjyF8sD6233MGJBLOCe3FbcjwIRC2L5X8WSOogFsSAWxIJYEAtiQSyQi8A4syAWQCyIBRALYgHEglgQC2JBLIgFsSAWxIJYEAtiAQAAAAAAAAAAAAAAAAAAAAAAAACAAvIbRNwB01NnU/AAAAAASUVORK5CYII='; // 处理Base64前缀(如果API返回的是带"data:image/png;base64,"开头的,必须去掉) const cleanBase64 = base64EncodedData.startsWith('data:image/png;base64,') ? base64EncodedData.split('data:image/png;base64,')[1] : base64EncodedData; const folderPath = 'C:/test/downloadedFile/'; const fileName = 'example.png'; // 用path.join避免路径拼接的兼容性问题 const filePath = path.join(folderPath, fileName); // 直接转换并写入文件 fs.writeFileSync(filePath, Buffer.from(cleanBase64, 'base64'));
方案2:浏览器/前端自动化测试环境
浏览器环境不支持fs模块,需用Blob或测试工具提供的API处理:
通用浏览器方法(创建下载链接)
const base64EncodedData = '你的Base64数据'; const cleanBase64 = base64EncodedData.startsWith('data:image/png;base64,') ? base64EncodedData.split('data:image/png;base64,')[1] : base64EncodedData; // 将Base64转为Blob对象 const blob = new Blob([Uint8Array.from(atob(cleanBase64), c => c.charCodeAt(0))], { type: 'image/png' }); const downloadUrl = URL.createObjectURL(blob); // 创建a标签触发下载 const downloadLink = document.createElement('a'); downloadLink.href = downloadUrl; downloadLink.download = 'example.png'; document.body.appendChild(downloadLink); downloadLink.click(); // 清理资源 document.body.removeChild(downloadLink); URL.revokeObjectURL(downloadUrl);
Cypress专用方法
Cypress内置了cy.writeFile方法,可直接处理二进制数据:
cy.request('GET', '你的API接口地址') .then(response => { const base64Data = response.body.base64EncodedData; const cleanBase64 = base64Data.startsWith('data:image/png;base64,') ? base64Data.split('data:image/png;base64,')[1] : base64Data; // 用Buffer转换后写入 cy.writeFile('C:/test/downloadedFile/example.png', Buffer.from(cleanBase64, 'base64'), 'binary'); });
Playwright专用方法
Playwright运行在Node.js环境,可直接结合fs处理:
const { chromium } = require('playwright'); const fs = require('fs'); (async () => { const browser = await chromium.launch(); const page = await browser.newPage(); // 发起API请求 const response = await page.request.get('你的API接口地址'); const responseData = await response.json(); const base64Data = responseData.base64EncodedData; const cleanBase64 = base64Data.startsWith('data:image/png;base64,') ? base64Data.split('data:image/png;base64,')[1] : base64Data; // 写入文件 fs.writeFileSync('C:/test/downloadedFile/example.png', Buffer.from(cleanBase64, 'base64')); await browser.close(); })();
关键注意事项
- 必须清理Base64前缀:如果API返回的Base64带有
data:image/png;base64,前缀,一定要先去掉,否则转换后的文件会损坏无法打开 - 环境匹配:Node.js环境用
fs,浏览器/前端测试环境用Blob或对应工具的API,不要跨环境调用不兼容的模块
内容的提问来源于stack exchange,提问作者abhishek pandey
相关产品推荐
相关产品推荐

