给力星

Web Developer

利用Content-disposition实现无刷新下载图片文件

今天在使用 tinypng.com 这个在线压缩图片的网站时,对其处理完图片后,可以无刷新下载图片感到好奇,于是了解了一下相关实现。无刷新下载可以利用MIME type或者设置Content-disposition来实现。

无刷新下载文件

无刷新下载 rar 之类的文件很好实现:

  • 通过 meta 标签: <meta http-equiv="refresh" content="url=http://down.load/file.rar">
  • 通过 Javascript 重定向: window.location.assign("http://down.load/file.rar")
  • 通过 Javascript 构建隐藏的 iframe 并设置 src $(body).append('<iframe style="display:none;" src="http://down.load/file.rar"')

以上的实现均可以在当前页面无刷新进行,效果如 sourceforge、github 上的源码下载。

无刷新下载图片

上述无刷新下载主要是因为 rar 这类文件,服务器上设定的 MIME type 会告知浏览器访问时采用下载的方式。但如果要实现无刷新下载图片,就不能简单的使用上述方法了,因为浏览器会依据图片的 MIME,选择显示照片而不是下载图片。

对 tinypng.com 下载图片的链接信息进行查看,发现了与普通图片地址的 Header 信息不同之处:Content-disposition。

Header中多了一个Content-dispositionHeader中多了一个Content-disposition

Content-disposition

Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当浏览器接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。

使用方式如: Content-Disposition: attachment; filename="fname.ext"fname.txt 是定义保存的名称,可随意指定。通过设置 HTTP header 中的Content-disposition ,就可以为图片临时定义新的 MIME,实现访问时提示保存。简单的 PHP 实现如下:

header('Content-Disposition: attachment; filename=girl.png');
// 禁止浏览器缓存,否则IE下可能会失效
header("Pragma: No-cache");
header("Cache-Control: No-cache");
header("Expires: 0");

// 简单的返回文件
echo file_get_contents('http://localhost/girl.png');

tinypng 的图片下载地址为 https://tinypng.com/web/output/m1rd5u43so88e1b5.png/girl.png,其中 output 是程序地址,m1rd5u43so88e1b5.png 是服务器上保存的文件,而 girl.png 则是用户保存时使用的文件名。

设置好 Content-disposition ,再利用前面提到的无刷新下载文件就可以实现图片的无刷新下载了,要实现 .txt,.css 文件下载也是如此。不过单纯通过 Javascript 无法定义 Content-disposition。

1条评论

发表评论

电子邮件地址不会被公开。