0

我已经看到这种方法现在在大约三个网站上使用,包括 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 中所做的事情?这对我来说听起来很合理,但经过一段时间的谷歌搜索,我没有找到任何接近我要求的东西。

4

3 回答 3

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);

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

我敢肯定还有更多选择,但是这两个是我现在唯一想到的。

于 2012-09-28T12:57:53.620 回答
0

我会将所有图像重定向到一个 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
}
于 2012-09-28T13:08:56.967 回答
0

此类 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');

你应该没事。

于 2012-09-28T13:10:29.173 回答