前端附件下载时可能会遇到一下情况:
微信小程序内(已添加过白名单)。iOS手机可以正常下载,并保存到相册。但是安卓手机只能下载,不能保存到相册。
H5网页附件下载功能,在所有的浏览器都能正常下载,但是在个别浏览器下载失败(如小米浏览器附件下载会一直提示失败)
附件下载功能变成了浏览功能
关于前端附件下载需要了解两个属性:
1、Content-disposition
Content-disposition
决定了附件的展示类型:
attachment:表示以附件方式下载,这种情况会弹出对话框提示用户下载。
inline:表示在页面中打开
设置方式可以在header中,也可以拼接到附件地址后面。两个类型后都可以添加参数filename
,只不过在inline
情况下,无任何意义。
1.1、设置下载后内容的文件名
如果需要修改下载后附件的文件名,需要在attachment
的基础上,再添加上filename
。类似:
Content-Disposition: attachment; filename="filename.jpg"
这样下载弹窗的提示内容就是filename
的内容。
若不设置filename
,会显示附件的原始文件名。这里需要注意的是:filename中不要带有空格,否则部分浏览器会不识别,提示失败
个人遇到的情况是:
filename
中存在空格,导致小米自带浏览器附件下载失败。其它浏览器暂没有发现这种问题。
2、Content-type
Content-type
代表了实体数据的数据类型,决定了下载后内容的后缀名,因此每一个附件都会有一个Content-type
值。
若无特殊需求,Content-type
不需要额外的设置。
如果不小心或者某种原因,在附件地址后面,又额外设置了这个参数。需要检查自己设置的类型和原先服务器默认的类型是否一致,否则在某些机型或浏览器可能无法保存到相册。
关于Content-type
的所有类型,可以查看百度百科,这里我挑了几个常见的类型,以及对应的文件后缀。
".*"="application/octet-stream" //个人遇到的情况为“.bin”
".doc"="application/msword"
".gif"="image/gif"
".jpeg"="image/jpeg"
".jpg"="image/jpeg"
".jpg"="application/x-jpg"
".mp1"="audio/mp1"
".mp2"="audio/mp2"
".mp2v"="video/mpeg"
".mp3"="audio/mp3"
".mp4"="video/mp4"
".pdf"="application/pdf"
".png"="image/png"
".png"="application/x-png"
".ppt"="applications-powerpoint"
".ppt"="application/x-ppt"
这里说一下application/octet-stream
,虽然所有附件都可以使用这个类型,但是他只能实现简单下载功能,如果需要保存到相册、文件中,最好还是设置附件具体的类型,类型不对在某些浏览器或者手机上就会出现下载失败或者保存失败的情况。
个人遇到的情况是:微信小程序内,使用
application/octet-stream
。下载完成后内容的后缀为.bin
,iOS手机上可以下载并保存到手机相册,安卓手机只能下载,保存失败,提示类型不对。
3、总结
附件下载关注参数Content-Disposition
。设置的类型没有问题,那么附件下载功能就是正常的
附件保存关注参数Content-type
。类型不对,下载完内容的后缀就不对,最终导致无法保存到相册。因为相册只能保存图片、视频等(如png、jpg、gif、mp4等文件)