Я ищу способ заставить браузер загружать изображение, а не просто отображать его.
Я уже много смотрел (и глубоко), и, похоже, нет стандартного способа сделать это правильно.
То, как Facebook это делает, это с некоторым PHP, я думаю, они поставили параметр в конце 😕 Dl = 1
Так что это, безусловно, страница PHP с переписыванием url, я думаю
<a class="itemAnchor" role="menuitem" tabindex="-1" href="http://img.ruphp.com/php/327910_2733459209258_1040639162_2895571_6924037615_o.jpg?dl=1" rel="ignore"><span class="itemLabel fsm">Download</span></a>
Поэтому, если у вас есть какая-то подсказка, как они это делают … Моя подсказка заключается в том, что они, вероятно, что-то делают в заголовках страницы PHP
Они просто принудительно загружают с использованием HTTP-заголовков так же, как и с любым другим файлом:
<?php $file = 'C:\\test.jpg'; header('Cache-Control: public'); header('Content-Description: File Transfer'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Type: '.mime_content_type($file)); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.filesize($file)); readfile($file); ?>
X-SendFile
Для больших файлов или занятых веб-серверов я бы предложил использовать заголовок X-SendFile вместо использования функции readfile()
(обратите внимание, что вам нужен mod_xsendfile
установленный в Apache).
header('X-Sendfile: '.$file); //readfile($file);
.htccess
Как вы заметили, URL-адрес Facebook указывает на файл jpg, а не на PHP. Вам нужно будет переписать URL-адрес в файле .htaccess
чтобы сделать этот трюк.
Что-то вроде следующего должно работать (обратите внимание, что вам нужно будет использовать реальный URL-адрес, проверяя содержимое $_SERVER
для этого).
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Вам нужно будет определить переменную Content-Disposition
в заголовке :
<?php header("Content-Disposition: attachment; filename='downloaded.png'"); ?>
Вы можете добиться этого, установив соответствующие заголовки перед отправкой файла. В частности, вы можете установить Content-Type
независимо от типа вашего контента и Content-Disposition: attachment; filename=<yourfilename>
Content-Disposition: attachment; filename=<yourfilename>
.
Есть некоторые gotchas с IE; проверьте этот ответ для получения дополнительной информации.