使用安卓手机自带的浏览器,打开页面,下载一个后缀名为.ica的文件,下载后该文件的名字和后缀名都不正确;
前后台之间使用blob流进行数据传输,前端为vue,先后使用过‘js-file-download’和‘file-saver’两个插件进行下载,在PC端没有问题,在安卓手机端浏览器,‘js-file-download’将下载的文件保存为.bin结尾的文件,‘file-saver’将下载的文件保存为.txt结尾的文件;并且文件名也和PC端的不一致,请问这个原因是怎么造成的?是后台那边设置的响应头有问题吗?也手动写过一个下载方法,结果在安卓手机端也得到一个.bin结尾的文件。ps:后台为java(spring boot)
目前问题已经得到解决,基本上适配了ios浏览器和安卓浏览器,在此总结一下:
1.前端使用Blob对象进行数据处理时,pc端是可以实现的,但是在移动端有兼容性问题,目前测试的情况是安卓手机的chrom和火狐是可以下载的;但部分安卓自带的原生浏览器会出现文件不识别的情况,会将下载的文件重新命名,命名的名字为window.URL.createObjectURL(blob)创建出来的地址中的字符串,如果是使用插件下载,'js-file-download'会将下载下来的文件改为以.bin为后缀名,'file-saver'会将文件后缀名改为.txt;自己构建a标签,创建blob对象进行下载,指定文件类型,var blob = new Blob([res.data], {type: "application/x-ica"}),可以改正下载文件的后缀名,但是文件名无法更改,大概是因为a标签的download属性在移动端兼容性不好的问题;ios手机浏览器,目前测试过Safari和chrom,都会直接打开window.URL.createObjectURL(blob)创建出来的链接地址,会出现地址不识别,或者直接以.txt打开文件的情况;
2.使用a标签直接下载,目前测试过pc端和ios端,pc端可以正常下载,但是在ios端会将文件以txt文件的形式打开,这个目前还不太清楚是不是后台没有正确指定MIME类型的原因造成的;但是后台将文件改为.zip结尾的情况,在ios浏览器可以以.zip的形式下载,下载完后选择保存到icloud,就可以在手机中的‘文件’中找到下载的zip;
3.使用window.open方式下载,这个是目前找到兼容性最好的方式,pc端和安卓、ios都测试过,都可以正常下载,且文件命名和后缀都正确,但是针对IOS浏览器时,要正确指定MIME类型,不然IOS会将文件以.txt的形式打开;.ica文件的MIME类型为"application/x-ica";
希望以上对各位有点帮助。