Отправка файла в браузер в качестве вложения

Как отправить файл в браузер в виде вложения, если указанный файл находится на стороннем сервере (без предварительной загрузки или потоковой передачи)?

С другого сервера без загрузки на ваш сервер:

 header('Location: http://thirdparty.com/file.ext'); 

Не загружая файл локально, у вас нет авторизации на внешнем сервере, поэтому вы должны сообщить обозревателю, что делать, и, таким образом, заголовок перенаправления, он скажет серверу перейти непосредственно к указанному url, загружая загрузку.

С вашего сервера вы бы сделали:

 if (file_exists($file)) { if(false !== ($handler = fopen($file, 'r'))) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); //Remove //Send the content in chunks while(false !== ($chunk = fread($handler,4096))) { echo $chunk; } } exit; } echo "<h1>Content error</h1><p>The file does not exist!</p>"; 

Из другого вопроса, на который я ответил

http://php.net/manual/en/function.header.php#example-3655

Если вы хотите, чтобы пользователю было предложено сохранить данные, которые вы отправляете, например сгенерированный PDF-файл, вы можете использовать заголовок «Content-Disposition» для подачи рекомендуемого имени файла и заставить браузер отображать диалог сохранения.

 <?php // We'll be outputting a PDF header('Content-type: application/pdf'); // It will be called downloaded.pdf header('Content-Disposition: attachment; filename="downloaded.pdf"'); // The PDF source is in original.pdf readfile('original.pdf'); ?> 

Как говорили другие, вы должны установить заголовок Content-disposition ответа на запрос загрузки файла. Однако вы сказали, что файл находится на стороннем сервере. Если вы не контролируете, как этот сервер отправляет этот файл, вы не можете изменить способ получения браузером с этого сервера.

Однако вы можете проксировать файл таким образом, чтобы ваш сервер загружал файл, а затем передавал его клиенту с соответствующими заголовками. Это означает, что вы удвоили свой счет за пропускную способность, тем не менее, поскольку вам приходится одновременно загружать файл и загружать его одновременно.

Просто примечание для тех, кто сталкивается с проблемами с именами, содержащими пробелы (например, «test test.pdf»).

В примерах (99% времени) вы можете найти заголовок («Content-Disposition: attachment; filename =». Basename ($ file));

но правильный способ установить имя файла – это цитата (двойная кавычка): header ('Content-Disposition: attachment; filename = "'. basename ($ file). '"');

Некоторые браузеры могут работать без кавычек, но наверняка не Firefox и, как объясняет Mozilla, цитата с именем файла в расположении контента соответствует RFC http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

Если вы хотите предоставлять файлы, которые регулярно обрабатываются браузером (изображениями, html, …), вы должны добавить заголовок для изменения типа MIME с помощью чего-то вроде:

header("Content-Type: application/force-download; name=filename");

Если у вас нет доступа к стороннему серверу, у вас нет выбора, кроме как загрузить файл самостоятельно, чтобы предоставить его пользователю, добавив заголовок