如何在浏览器中强制下载图片?

10
我希望强制用户下载图片,而不是在浏览器中打开。
虽然使用HTML5的download属性可以实现,但目前仅有Chrome支持。
我尝试了使用.htaccess方案,但并没有成功。
<Files *.jpg>
   ForceType application/octet-stream
   Header set Content-Disposition attachment
</Files>

如果用户点击链接,我该如何强制下载所有图片?
<a href="http://blablabla.com/azerty/abc.jpg" target="_blank" />Download</a>

双引号如何?"attachment" - Adi
@AdnanShammout:这真的不会改变任何事情。 - netcoder
那么我认为您应该确保在您的 php.ini 中取消注释 mod_headers - Adi
我知道的就是它能够工作。请仔细检查您的Web服务器配置,如果您感觉无法完成,请联系通常负责此项工作的技术人员(系统管理员),同时参见ForceType指令Header指令 - hakre
2个回答

15

有两种方式可以实现这个功能 - 一种是使用JS,另一种是使用PHP。

在JS中,可以参考这个网站的方法:

<a href="javascript:void(0);"
 onclick="document.execCommand('SaveAs',true,'file.html');"
 >Save this page</a>

在PHP中创建一个名为download.php的脚本,其代码类似于以下代码:
<?php
// Force download of image file specified in URL query string and which
// is in the same directory as the download.php script.

if(empty($_GET['img'])) {
   header("HTTP/1.0 404 Not Found");
   return;
}

$basename = basename($_GET['img']);
$filename = __DIR__ . '/' . $basename; // don't accept other directories

$mime = ($mime = getimagesize($filename)) ? $mime['mime'] : $mime;
$size = filesize($filename);
$fp   = fopen($filename, "rb");
if (!($mime && $size && $fp)) {
  // Error.
  return;
}

header("Content-type: " . $mime);
header("Content-Length: " . $size);
// NOTE: Possible header injection via $basename
header("Content-Disposition: attachment; filename=" . $basename);
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
fpassthru($fp);

那么将图片链接设置为指向该文件,如下所示:
<img src="/images/download.php?img=imagename.jpg" alt="test">

2
JS方法在FF和Chrome中无法正常工作,您需要修改.htaccess文件:https://dev59.com/xUfRa4cB1Zd3GeqP9Xyb - peter.o
1
自从几个月前这个被标记为正确后,你为什么要回来说现在它是错误的?你提供的问题中有错误的JS语法——第二个参数需要是布尔值true,而不是字符串"true"。 - SickHippie
execCommand是IE特定和非标准的,可以在这里找到更多信息-http://msdn.microsoft.com/en-us/library/ms536419(v=vs.85).aspx-从问题的光线来看,很明显OP要求跨浏览器兼容的规范。 - 那么你没有解释为什么(或为什么不)按照问题中概述的.htaccess没有成功。相反,这只是完成某事的附加方式,我敢打赌早就有人对此作出了更好的回答,但你甚至没有提供参考。更不用说代码可读性可以大大提高。 - hakre
所以,尽管我写的代码几个月前对 OP 有效,但你几乎完全重写了 PHP,并删除了我从哪里获取它的引用。更糟糕的是,你还修改了 OP 的问题。然后你又做出了一些假设(“我敢打赌已经有更好的答案了...”),甚至不费心去查看自己是否正确。哇。 - SickHippie

-2

请在您的 .htaccess 文件中尝试以下内容:

<FilesMatch "\.(?i:jpg|gif|png)$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接