0.概述文件下载是Web应用程序中非常常见的场景。在浏览器中下载文件最基本的方式是在页面中隐藏iframe,然后将文件下载地址加载到iframe中,从而触发浏览器的下载行为。另外html5引入了a标签的download属性,也是一种下载方式。下载下面介绍下载地址的ResponseHeader、浏览器兼容性以及一些特殊情况。1、什么样的文件url可以触发浏览器的下载行为?有两种url可以触发浏览器下载:响应头指定Content-Disposition为附件,意思是让浏览器把响应体作为附件下载到本地(一般Content-Disposition也会指定filename,下载的文件默认为filename指定的名称)响应头中指定的Content-Type为application/octet-stream(无类型)或application/zip(下载zip包时)和其他几个不常见的类型(包括浏览器差异),其中application/octet-stream表示http响应为二进制流(不指定明确类型),需要下载到本地,由系统决定或用户手动指定。关于application/octet-stream的情况,我想针对这种回应补充几点。由于没有明确的类型,如果是作为文件下载,下载的文件将没有文件名和扩展名(文件名直接取自url路径的最后一部分。)如果不是作为文件下载例如,已知响应体是一张图片,可以使用img标签显示下载的图片内容,但是缺少文件扩展名,文件内容完整。如果你知道它的实际扩展名,如果你手动更改它,你可以用系统默认程序打开它。如果不改扩展名,也可以通过指定应用程序打开响应头的Content-Type。补充几点,首先要明确。Content-Type只是HTTP协议的一部分。它不会影响响应主体本身。Content-Type影响响应的接收者(通常是浏览器)。对于浏览器来说,它会影响浏览器处理响应体的方式。例如指定为application/zip,浏览器就会用pdf阅读器打开。Content-Type之于浏览器,就像文件扩展名之于操作系统一样,影响默认行为。如果你指定了打开方式,那么Content-Type就不起作用了。比如你在服务器上为图片URL设置了Content-Type为application/zip,但是你在浏览器中使用img标签(相当于指定了打开方式)来加载图片,仍然可以加载图片通常情况下。为什么上面提到的“Content-Type”和“FileExtension”对文件本身没有影响呢?这里涉及“文件格式协议”/“文件头”等内容,待补充...2.下载方式只要满足上面“触发浏览器自动下载”的url,就可以了可以是iframe的形式。一般的用法是将iframe隐藏在html中,然后在业务代码中通过设置iframe的src来实现下载。3、下载方式download兼容主流浏览器特殊情况:Safari只支持“能触发浏览器下载”的url,Firefox只支持“能触发浏览器下载”的url。另外,还有一点需要注意——当点击a标签时,会触发“浏览器离开当前页面”的行为。解决这个问题的方法是“再匹配一个iframe,把a标签的target指向这个iframe”,这样就不会出现跳转到Chrome“无法触发浏览器下载”的URL的页面,并且可以也可以通过这种方式下载。4.使用哪种方式对于下载源完全自己掌控(即ResponseHeader统一)的业务场景,推荐使用