起因描述

做一个web下载docx的功能,后台读取文件,Response写流,到前端通过Blob创建下载链接,一切正常

但是最后发现文件下载后就打不开了,显示需要修复,修复后就可以打开了

各种查找,基本都是在blob格式上找问题,尝试了,都不可以

适配现象

最后对比下源文件和下载后的文件,下载的文件总比源文件多出几个字节
往上追溯了下,发现BufferedInputStream 还是132511 字节,到了blob变成了132513字节了

解决方案

应该是传输过程转换成2进制出了问题,但是一是找不出原因
恰好查了查Blob的 API

Blob.slice() 方法用于创建一个包含源 Blob的指定字节范围内的数据的新 Blob 对象。

ar blob = instanceOfBlob.slice([start [, end [, contentType]]]};

参数
start 可选
这个参数代表 Blob 里的下标,表示第一个会被会被拷贝进新的 Blob 的字节的起始位置。如果你传入的是一个负数,那么这个偏移量将会从数据的末尾从后到前开始计算。举例来说, -10 将会是  Blob 的倒数第十个字节。它的默认值是0, 如果你传入的start的长度大于源 Blob 的长度,那么返回的将会是一个长度为0并且不包含任何数据的一个 Blob 对象。

end 可选
这个参数代表的是 Blob 的一个下标,这个下标-1的对应的字节将会是被拷贝进新的Blob 的最后一个字节。如果你传入了一个负数,那么这个偏移量将会从数据的末尾从后到前开始计算。举例来说, -10 将会是 Blob 的倒数第十个字节。它的默认值就是它的原始长度(size).

contentType 可选
给新的 Blob 赋予一个新的文档类型。这将会把它的 type 属性设为被传入的值。它的默认值是一个空的字符串。

返回值
一个新的 Blob 对象,它包含了原始 Blob 对象的某一个段的数据。

灵机一动,干脆去掉两个字节,这下竟然正常了!
具体原因还没分析,权当给遇到相同问题的提供个临时方案。

response.data.slice(0 , -2 )

另外推荐个web页面上创建文件下载链接的JS工具:FileSaver.js

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐