【记录避坑AJAX处理文件流】为什么预览/下载文件是空白的?(含过程和解决方法)

一、场景

在jQuery+HTML的前端项目中,想要实现通过接口获取文件并预览。

例如:档案管理需要上传附件,产品要求 —— 上传后的附件支持预览。于是,我先采用iframe展示文件缩略图,再通过【点击预览】按钮,打开新标签页展示文件内容。

在这里插入图片描述

在这里插入图片描述

二、问题描述

在实现预览时发现,ajax发出请求后获取到的数据是乱码字符串。

在这里插入图片描述
于是,我在网上查询了一些方法,包括设置headers、responseType等,结果并未改变。发出的请求始终都返回上图里的乱码字符串。

三、调研过程

显然,问题出在ajax上。这时我找到了一篇题为 前端接收数据实现图片预览效果–ajax请求二进制流 的文章,文章中详细描述了和我相似的问题。于是我参考他的解决方法进行调整:

3.1 确定根因

通过jQuery官网里的ajax api了解到,datatype的数据类型默认以string返回,且另外支持xml, json, script, text, html。也就是说,当接口请求文件时,就算是二进制流也会按照字符串返回。
在这里插入图片描述

3.2 另寻他法

既然ajax不能用,那就回到原生XHR,从底层改写返回类型。参考:XHR responseType官网API

在这里插入图片描述
现在成功返回了Blob对象,接下来就是利用这个文件对象创建DOM并返回URL,就能用window.open直接打开。

var xhr = new XMLHttpRequest();
xhr.open('GET', '/rpsm-web' + fileurl);
xhr.responseType = 'blob';
xhr.onload = function (){
    var PDFurl = window.URL.createObjectURL(xhr.response);
    window.open(PDFurl);
};
xhr.send();

3.3 解析方法

从我的理解上讲,ajax基于XHR封装,而封装内容里限制了XHR的responseType。
所以在需要用到二进制文件上传/下载时,就不能依赖于jQuery的ajax,而必须 根据XHR重新封装自己的ajax对象 or 直接调用XHR请求

四、总结

一直使用jQuery、调用jQuery的ajax,其实始终未理解本质,这也是导致前期调研不断试错的原因。往后还是要多学习多领悟,从入门到入土 —— ( •̀ ω •́ )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,你可以使用jQuery提供的`$.ajax`方法来获取Java后台返回的文件,并进行处理。以下是一个示例代码: ```javascript function downloadExcel() { $.ajax({ url: 'your-export-url', type: 'GET', dataType: 'blob', success: function(data) { var blob = new Blob([data], { type: 'application/vnd.ms-excel' }); var fileName = 'your-file-name.xls'; if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveBlob(blob, fileName); } else { var url = window.URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = fileName; a.click(); window.URL.revokeObjectURL(url); } }, error: function(xhr, status, error) { console.error('Error:', error); } }); } ``` 在这个示例代码中,我们使用了`$.ajax`方法来获取Java后台返回的文件,并设置`dataType`为`blob`。然后,在`success`回调函数中对返回的文件进行处理。 如果返回的状态码为200,我们就将文件转换成`Blob`对象,并指定文件类型为Excel文件。如果浏览器支持`msSaveOrOpenBlob`方法,我们就使用该方法下载文件。否则,我们通过创建一个`a`标签,并设置`href`和`download`属性来下载文件。最后,我们通过`URL.revokeObjectURL`方法释放URL对象。 需要注意的是,这里的`your-export-url`是你的Java后台导出Excel的接口地址,`your-file-name.xls`是你要下载文件名。如果出现错误,`error`回调函数会被调用,并输出错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值