为何设置data:text/plain仍可下载图片?ASP.NET+AJAX技术问题
data:text/plain仍能下载图片类型的文件? 这其实是浏览器处理download属性与Data URI的逻辑在起作用,具体可以从这几个关键点来理解:
download属性的优先级更高
当你给<a>标签指定download属性时,浏览器会优先根据这个属性里的文件名后缀来识别文件类型,进而决定下载后的文件格式。哪怕Data URI里的MIME类型写的是text/plain,只要download的值是pointing_2017_07_17_03_17_60.png,浏览器就会把它当作图片文件处理,下载完成后系统也会用对应的图片应用打开它。Data URI的MIME类型是“提示”而非强制约束
data:text/plain;base64,...中的text/plain只是告诉浏览器“这段编码数据的格式是纯文本”,但Base64本身只是一种二进制转字符串的编码方式——不管原文件是文本还是图片这类二进制资源,编码后都是一串字符串。浏览器在处理下载时,会结合download的文件名后缀,把Base64解码还原成对应格式的文件。现代浏览器的容错机制
现在的浏览器对MIME类型和实际文件内容不匹配的情况有很强的容错性,不会因为这个矛盾就拒绝下载。只要你的Base64编码内容是正确的图片二进制数据,再配上.png的文件名,浏览器就能正确解码并保存成可用的图片文件。
举个简单的测试例子:如果把你的AJAX代码里的download值改成image.txt,那么下载后的文件会是一个文本文件,打开后能看到图片的Base64编码内容;但如果保持.png后缀,哪怕MIME类型是text/plain,结果还是正常的图片文件。
内容的提问来源于stack exchange,提问作者user9538218

