You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:50:01