使用安卓手机的浏览器,打开页面,下载文件,文件的名字和后缀都和pc端不一致,请问这是为什么?

使用安卓手机自带的浏览器,打开页面,下载一个后缀名为.ica的文件,下载后该文件的名字和后缀名都不正确;
前后台之间使用blob流进行数据传输,前端为vue,先后使用过‘js-file-download’和‘file-saver’两个插件进行下载,在PC端没有问题,在安卓手机端浏览器,‘js-file-download’将下载的文件保存为.bin结尾的文件,‘file-saver’将下载的文件保存为.txt结尾的文件;并且文件名也和PC端的不一致,请问这个原因是怎么造成的?是后台那边设置的响应头有问题吗?也手动写过一个下载方法,结果在安卓手机端也得到一个.bin结尾的文件。ps:后台为java(spring boot)

阅读 12.5k
4 个回答

目前问题已经得到解决,基本上适配了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";
希望以上对各位有点帮助。

新手上路,请多包涵

楼主你好,我目前正被这个问题困扰,特别是华为原生浏览器,我想请问一下你最后的兼容性解决方案是什么?

新手上路,请多包涵

楼主请问下 我用你第三种方式:
1:blob 下载: 手机浏览器下载生成以‘.bin’后缀结尾的文件
image.png
2:我也尝试用 file 下载:结果和上面一样
image.png
3:window.open
测试结果:手机端 (vivo自带浏览器)弹出一个页面。页面没有执行下载。
image.png

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