【问题标题】:How to force download an image without a script, but with $_GET?如何在没有脚本但使用 $_GET 的情况下强制下载图像?
【发布时间】:2012-09-28 12:49:44
【问题描述】:

我已经看到现在大约三个网站使用了这种方法,包括 Facebook、Dropbox 和微软的 Skydrive。它是这样工作的。假设您想在不下载的情况下查看图像,那么您只需执行此操作。

https://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-xxxx/xxx_xxxxxxxxxxxxxxx_xxxxxxxxx_o.jpg

但如果我想下载它,我会添加 ?dl=1

https://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-xxxx/xxx_xxxxxxxxxxxxxxx_xxxxxxxxx_o.jpg?dl=1

很简单吧?好吧,在服务器端可能并不容易,这就是我的问题所在。如果该 .jpg 文件是 PHP 脚本并且 $_GET 参数指向图像并且另一个参数将指定是否要下载图像,我会知道如何执行此操作。但事实并非如此。

那么,我尝试了哪些方法?没有任何。因为我真的不知道这是如何工作的,这对我来说就像魔术一样。也许这是您在 .htaccess 中所做的事情?这对我来说听起来很合理,但经过一段时间的谷歌搜索后,我没有找到任何接近我要求的东西。

【问题讨论】:

标签: php download get force-download


【解决方案1】:

你有一些选择。

一种选择是使用 PHP 脚本而不是 .jpg 文件。所以你的 URL 会指向一个 PHP 文件,并且在 PHP 文件中你会做这样的事情:

header('Content-Type: image/jpeg');

if ($_GET['dl'] == 1)
    header('Content-Disposition: attachment; filename="downloaded.jpg"');

$file = $_GET["file"];
// do some checking to make sure the user is allowed to get the file specified.
echo file_get_contents($file);

另一种选择是在您的 .htaccess 文件中使用 mod_rewrite 来检查 ?dl=1,如果找到,则重定向到将下载该文件的 PHP 脚本(与上述相同)。

我敢肯定还有更多选择,但现在我脑子里只有这两个。

【讨论】:

  • 顺便说一句,您也可以将脚本重命名为 IMG_126.jpg.php 并使用 .htaccess 删除 .php 扩展名。
【解决方案2】:

我会将所有图像重定向到一个 PHP 文件,该文件将根据它们的 URI 参数处理它们。

在 .htaccess 中我会放:

Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteCond %{REQUEST_URI} \.(jpg|png|gif)$
RewriteRule (.*)  images.php [QSA]

</IfModule>

这将使对扩展名为 jpg、png 和 gif 的文件的所有请求重定向到您的 images.php 文件。

在 images.php 文件中,我会搜索 ?dl=1 的存在,然后决定如何提供图像:

$requestedImage = $_SERVER['REQUEST_URI']
if (strpos($requestedImage,'?dl=1') !== false) {
    // serve the image as attachment
}else{
    // just print it as usual
}

【讨论】:

  • 这是一个很棒的答案,但是,在与我的 ISP 联系后,我发现不支持 Options +FollowSymLinks。真糟糕。我有另一台服务器,所以我会尝试看看它在那里是如何工作的,然后在这里回复大家。
  • 嗯...虽然我没有收到内部服务器错误,但这是我在访问脚本时得到的:解析错误:语法错误,/home/a2901076/ 中的意外 T_IF第 4 行的 public_html/images.php 这也意味着当我将 ?dl=1 添加到图像时也没有任何反应。
  • 添加全能; after $requestedImage = $_SERVER['REQUEST_URI'] (: 好像忘记加了
  • 现在没有 PHP 错误,而是出现了一个空白页面。嗯,我错过了什么?非常感谢您的帮助!
【解决方案3】:

在这样的 facebook URL 上显示响应标头:

HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 5684
Last-Modified: Fri, 01 Jan 2010 00:00:00 GMT
X-Backend: hs675.ash3
X-BlockId: 157119
X-Object-Type: PHOTO_PROFILE
Access-Control-Allow-Origin: *
Cache-Control: max-age=1209600
Expires: Fri, 12 Oct 2012 13:07:08 GMT
Date: Fri, 28 Sep 2012 13:07:08 GMT
Connection: keep-alive

以及下载响应标头:

HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 5684
Last-Modified: Fri, 01 Jan 2010 00:00:00 GMT
X-Backend: hs675.ash3
X-BlockId: 157119
X-Object-Type: PHOTO_PROFILE
Content-Disposition: attachment
Access-Control-Allow-Origin: *
Cache-Control: max-age=1209600
Expires: Fri, 12 Oct 2012 13:07:17 GMT
Date: Fri, 28 Sep 2012 13:07:17 GMT
Connection: keep-alive

请参阅Content-Disposition: attachment 行,这是不同的。

因此,由于您已经从 PHP 脚本提供图像,因此如果设置了下载参数,请添加:

header('Content-Disposition: attachment');

你应该没事的。

【讨论】:

  • 我没有使用 PHP 脚本,这正是我想要避免的。
  • 你也可以对你的网络服务器配置做类似的事情。它只是一个额外的标题行,很容易添加。您会在您的网络服务器手册中找到该文档。
猜你喜欢
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 2015-11-29
  • 2010-10-23
  • 2019-02-04
  • 2012-08-16
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多