求助:从Ajax响应生成.doc/.xls文件失败,.txt文件可正常生成
解决Ajax下载二进制文件(如.doc/.xls)后无法正常打开的问题
这个问题我之前也碰到过!核心原因是Ajax默认会把响应当作文本内容处理,而.doc、.xls这类是二进制格式的文件,文本编码转换会直接破坏文件的二进制结构,所以打开时会提示文件损坏。生成.txt没问题是因为txt本身就是纯文本格式,不会受编码转换影响。
给你整理了修复后的代码和关键修改点:
修正后的实现代码
const fs = require('fs').promises; // 建议用promise版fs,更易处理异步 const exec = require('child_process'); let settings = { url: `${Constante.URL}`, // 补全原代码里缺失的闭合引号和大括号 headers: { Authorization: sessionStorage.getItem('authorization') }, // 关键:告诉Ajax要处理二进制数据 xhrFields: { responseType: 'blob' } }; $.ajax(settings) .done(async (response) => { // 将Blob转换为Node.js可写入的Buffer const buffer = Buffer.from(await response.arrayBuffer()); // 写入二进制文件 await fs.writeFile('file.doc', buffer); // 打开文件 exec('file.doc', (err, stdout, stderr) => { if (err) { console.error(err); return; } console.log('文件打开成功'); }); }) .fail(err => { showError(err); });
关键修改说明
- 添加
xhrFields配置:通过responseType: 'blob'告诉jQuery,服务器返回的是二进制Blob数据,不要做文本编码转换,保留原始二进制结构。 - 转换Blob为Buffer:Node.js的
fs.writeFile直接写Blob会出错,需要先把Blob转成Buffer才能正确写入二进制文件。 - 修复原代码语法错误:补全了URL拼接时缺失的引号和大括号,同时改用
fs.promises处理异步写入,代码更简洁易维护。
如果你的运行环境是浏览器而非Node.js,写法会略有不同,但从代码里的fs和child_process来看,你应该是在Node.js环境下运行,上面的方案完全适用。
内容的提问来源于stack exchange,提问作者billy boy
相关产品推荐
相关产品推荐

