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

客户端下载blob文件报未授权访问错误、文件损坏该如何解决?

根因说明

第三方资源接口仅允许白名单内的服务端IP访问,你当前前端代码直接从客户端发起请求,来源IP为客户端公网IP,不在白名单范围内,因此接口返回未授权错误响应而非预期的ZIP二进制流,最终导致下载文件损坏。

修复方案

1. 服务端新增代理转发接口

在你的业务服务端新增专属下载代理接口,接口逻辑如下:

  • 接收前端传递的文件标识参数
  • 由服务端向https://api.example.com的资源地址发起请求,因服务端IP在白名单内,可正常获取ZIP文件流
  • 服务端将获取到的二进制流原样返回给前端,同时配置正确的响应头:
    Content-Type: application/zip
    Content-Disposition: attachment; filename="自定义文件名.zip"
    Access-Control-Allow-Origin: 你的前端域名(存在跨域时配置)
    

2. 修正前端请求逻辑

修改原前端代码的请求地址,同时修复原代码的语法错误与不合理配置:

// 替换原第三方接口地址为你的服务端代理接口地址
xhttp.open("GET", "/api/proxy-download?file=" + encodeURIComponent(file), true);
// 删除原不合理配置:GET请求无请求体,不需要设置Content-Type请求头
xhttp.responseType = "blob";
xhttp.onload = function (event) {
    // 新增请求状态校验
    if (xhttp.status >= 200 && xhttp.status < 300) {
        const blob = xhttp.response;
        // 补全原代码缺失的if关键字
        if (blob.size > 0) {
            const link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = fileName;
            link.click();
            // 新增内存释放逻辑,避免内存泄漏
            window.URL.revokeObjectURL(link.href);
        }
    } else {
        console.error('下载失败,错误状态码:', xhttp.status);
    }
};
xhttp.send();

3. 大文件场景优化

如果下载的ZIP文件体积较大,可在服务端代理时开启流式响应,无需等待整个文件完全下载到服务端再返回给前端,有效降低服务端内存占用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:06:03