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

API导出XLS文件异常:响应乱码但Swagger下载正常求助

API导出XLS文件返回乱码,Swagger下载正常的问题排查

问题现象

调用API导出XLS文件时,响应返回一串乱码字符,无法正常解析为Excel文件,但在Swagger中点击下载按钮却能正常获取并打开文件。已尝试修改downloadDocFile和handleExport函数,问题仍未解决。

相关代码

function downloadDocFile(data: Blob, ext = 'xlsx', name = 'Export'): void {
  const downloadUrl = window.URL.createObjectURL(new Blob([data]))
  const link = document.createElement('a')
  link.href = downloadUrl
  link.setAttribute('download', `${name}-${DateTime.now().toLocaleString()}.${ext}`)
  document.body.appendChild(link)
  link.click()
  link.remove()
}

const loading = useLoading()
function handleExport() {
  loading.show()
  const url = `/bill-of-material/${bomItems.value[0]?.billOfMaterialId}/available-kits/export-xls`
    
  getApiInstance('kitting')
    .post(url, { responseType: 'blob' })
    .then((data: any) => {
      if (data) {
        downloadDocFile(data)
      }
      loading.hide()
    })
}

可能的问题原因及解决方案

  • responseType参数位置错误
    多数HTTP客户端库(如Axios)中,responseType属于请求配置项,需放在第三个参数的配置对象中,而非第二个参数(请求体)。当前代码把{ responseType: 'blob' }当作POST请求的data传递,导致请求未正确设置响应类型,服务器返回的二进制数据被当作字符串解析,出现乱码。
    修改示例:

    getApiInstance('kitting')
      .post(url, {}, { responseType: 'blob' }) // 空对象作为POST请求体,配置项放第三个参数
      .then((response) => {
        if (response.data) { // Axios响应数据存在于response.data中
          downloadDocFile(response.data)
        }
        loading.hide()
      })
    
  • 响应数据被自动解析为字符串
    若客户端库默认将响应解析为UTF-8字符串,即使设置了responseType也可能出现乱码。可尝试将乱码字符串转换回Blob:

    // 若data是乱码字符串,强制转换为Blob
    const blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
    downloadDocFile(blob)
    
  • 缺失必要请求头
    Swagger发起请求时可能自动携带了Accept: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet这类请求头,而你的代码未设置,导致服务器返回了非预期格式的响应。可手动添加请求头:

    getApiInstance('kitting')
      .post(url, {}, {
        responseType: 'blob',
        headers: {
          'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        }
      })
      .then(...)
    
  • 全局拦截器修改了响应
    检查getApiInstance返回的实例是否存在全局响应拦截器,可能拦截器将Blob数据转换为了字符串。可临时禁用拦截器测试,或在拦截器中判断导出接口的URL,跳过数据转换逻辑。

内容的提问来源于stack exchange,提问作者Maxim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:58:20