后台返回文件流,前端下载成pdf文件,下载成功,但是,展示的是空白,没有任何文件,请指点?

1,后台返回文件流

clipboard.png
2,下载的pdf,展示空白

clipboard.png


3.这是前端下载代码

clipboard.png

阅读 25.2k
9 个回答
新手上路,请多包涵

不知楼主的问题是否解决了~~~先回答一波吧,可能后续有人也会需要。今天在做相同的功能时也遇到了同样的问题,下载的pdf文件一直是空白,后来查阅了很多资料发现:在发送请求是需要设置responseType: arraybuffer,下载的才会又内容。如:
axios.get(url, {
responseType: arraybuffer
}).then()

responseType是否设置正确了,二进制文件一般设置为blob即可。

新手上路,请多包涵

后端如果是byte流
前端设置:response-type=blob,就可以正常接收了

新手上路,请多包涵

移动端不支持这种下载

新手上路,请多包涵

采用ajax的方式;我这是提供了下载链接。然后但是不下载。直接打开pdf文件预览

 $.ajax({
        cache: true,
        type: "GET",
        url: '输入你的URL下载地址',  //pdf文件流的请求接口
        async: false,
        mimeType: 'text/plain; charset=x-user-defined',//jq ajax请求文件流的方式  (起作用的重点)
        error: function () {
            alert("网络原因请求失败!");
        },
        success: function (data) {
            var rawLength = data.length;
            var array = new Uint8Array(new ArrayBuffer(rawLength));
            for (i = 0; i < rawLength; i++) {
                array[i] = data.charCodeAt(i) & 0xff;
            }
            //上面是把后台请求到的文件流进行转化为符合的流
            var blob = new Blob([array], { type: 'application/pdf;charset-UTF-8' });
            
            var fileURL = window.URL.createObjectURL(blob)
            window.open(fileURL)

        }
    });

在 stackoverflow 上找到的解决方案,写给后来因为这个问题进来的同学
解决方案
大概意思就是让后端改成传 base64 过来

新手上路,请多包涵

直接调用接口postman下载接口返回的流没问题的时候,需要考虑前端的下载方式,axios 发送请求是否被重写了,例如 下面截图中说的这个引入 mockjs 会重写 XMLHttpRequest 导致无法解析流
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏