文件流下载文件后提示不支持打开该类型文件或文件已损坏

博客讲述了在React项目中,通过后端返回的文件流进行前端下载时遇到的问题及解决方案。作者发现下载的PDF文件无法用Office和WPS打开,原因是未设置responseType为'blob'。设置后,文件能够正常下载并打开。解决方案包括检查后端文件流、模拟请求验证文件流正确性,以及在前端axios请求中添加responseType设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在react项目中用到下载,请求后端接口返回文件流,前端来处理文件流生成文件后下载。

要设置responseType!!

采用的方法就是百度上随便一搜就可以搜到的Blob方法,最开始要下载的文件格式为.pdf,但是下载完的文件用office和WPS都打不开,先说怎么解决的这个问题,之前在百度的时候也看到有人说设置responseType就可以了,但是不信邪,就不设置,结果还真的是因为responseType,设置之后下载完的文件就都可以打开啦!

解决思路:
1、先让后端把文件流传的文件变成一个空白文档,首先可以确定的是下载没问题,可以下载下来文件,并且空白的文件是可以用Office打开的,文件流应该也没问题
2、用模拟请求的工具尝试了一下,下载的文件也可以正常打开,那么文件流一定没问题,问题应该就出在前端了
3、后端提供了其他项目下载的方法,使用的是layUI框架的,代码如下

//文件下载
function downLoadFile(ids, name) {
    //创建下载请求
    var oReq = new XMLHttpRequest();
    //url参数为拿后台数据的接口
    oReq.open("POST", '请求的下载地址', true);
    oReq.responseType = "blob"; //设置responseType
    oReq.onload = function (oEvent) {
        var content = oReq.response;
        var elink = document.createElement('a');
        //name为后台返给前端的文件名,后缀名必须加,后台有返回后缀就不用管,不然下载在本地不好打开。
        elink.download = name + ".xlsx";
        elink.style.display = 'none';
        var blob = new Blob([content], {type: "application/x-www-form-urlencoded"});
        elink.href = URL.createObjectURL(blob);
        document.body.appendChild(elink);
        elink.click();
        document.body.removeChild(elink);
    };
    oReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");//这个相对来说都不是很重要
    //请求头里放入用户口令,必须在.open()和.send()之间设置
    oReq.setRequestHeader('Blade-Auth', '设置balde-auth');
    oReq.send('可以设置需要的参数');
}

我写的代码如下

//请求完接口后调用该方法 将文件流data和其他需要的数据参数传过来
saveData(data, filename) {
    let blob = new Blob([data], { type: 'application/x-www-form-urlencoded' });
    let blobUrl = window.URL.createObjectURL(blob);
    const aElement = document.createElement('a');
    document.body.appendChild(aElement);
    aElement.style.display = 'none';
    aElement.href = blobUrl;
    aElement.download = filename;
    aElement.click();
    document.body.removeChild(aElement);
}

看起来代码就是一样的嘛,只不过我的接口请求是axios封装后的,balde-auth也在封装部分设置好了,看来看去只有一处不同,那就是没有设置responseType,我甚至还试了一下没用封装的接口请求,直接就用最上面的代码也是好使的,那就是responseType的问题了,在axios封装里面加上了responseType就可以了。

/**
 * 设置请求拦截器,添加token
 */
axios.interceptors.request.use(
    config => {
        if (config.method === 'post') {
            if(config.url.includes(url.common.filedownload)){
                config.responseType = 'blob'; //请求加上responseType
            }
        }
        return config
    },
    error => {
        message.error('请求出错' + error);
        return Promise.reject(error);
    }
)

告诉请求前端想要的是blob的就可以了

### Word打开从网络下载文件提示文件损坏的解决方案 当尝试打开通过网络下载的Word文件时,如果收到“文件已损坏”的提示,可能是由于以下几个原因造成的: 1. **文件未完全下载** 文件在传输过程中可能因网络中断其他因素未能完整保存到本地设备中。这种情况下,重新下载并验证文件完整性是一个有效的解决办法。 2. **安全设置限制** Windows操作系统可能会标记来自互联网的文件为不安全,默认阻止访问这些文件的内容。可以通过修改文件属性来解除这一限制[^3]。 3. **软件兼容性问题** 如果使用的Microsoft Office版本较旧,而文件是由更高版本创建,则可能出现兼容性问题。更新Office至最新版可以减少此类冲突的发生概率。 4. **病毒恶意软件感染** 下载文件有可能携带病毒者被篡改过,从而破坏了正常的结构格式。运行杀毒扫描工具检查是否有潜在威胁存在是有必要的。 针对上述提到的各种可能性,以下是具体的处理措施: #### 方法一:确认文件是否完好无损 - 使用浏览器开发者模式下的缓存查看器者其他专门的应用程序检测目标资源的真实大小与实际获取的数据量是否一致。 - 对比源服务器上的哈希值(如果有提供的话),确保两者匹配说明数据流没有发生改变。 #### 方法二:调整文件的安全选项 对于已经被Windows识别成外来项的情况: 1. 右键点击该文档图标选择`属性`菜单; 2. 查找是否存在名为`解锁`的复选框按钮; 3. 勾选它之后按下底部的`应用`以及`确定`按键完成设定更改过程; 另外一种途径涉及到了更深层次的信任机制配置方面: - 进入微软办公套件内部界面依次找到`文件 -> 选项 -> 信任中心`; - 接着选取左侧列表中的项目——`信任中心设置...`, 再跳转至子页面里头执行恢复出厂参数命令即可恢复正常状态. #### 方法三:升级您的应用程序环境 始终让自己的电脑保持拥有最新的补丁包和技术支持服务能够有效预防很多未知状况的发生。特别是涉及到跨平台协作场景下尤为如此。 #### 方法四:清理潜在风险因子 利用可靠的第三方防护产品进行全面体检活动可以帮助发现那些肉眼难以察觉的危害成分。一旦定位成功就要立即采取行动予以清除掉它们的影响范围。 最后值得注意的是,在某些特殊条件下即使遵循以上指导方针依旧无法修复受损实例的时候,不妨考虑借助专业的恢复类软件尝试挽救有用的信息部分出来备用[^4]。 ```python import os from hashlib import md5 def verify_file_integrity(file_path, expected_md5): """Verify the integrity of a downloaded file by comparing its MD5 hash.""" with open(file_path, 'rb') as f: content = f.read() actual_md5 = md5(content).hexdigest() return actual_md5 == expected_md5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值