Отправка файла в браузер в виде вложения - PullRequest
9 голосов
/ 13 апреля 2011

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

Ответы [ 5 ]

15 голосов
/ 13 апреля 2011

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

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

Взято с другого вопроса Я ответил

5 голосов
/ 13 апреля 2011

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');
?>
0 голосов
/ 13 марта 2014

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

В примерах (99% времени) вы можете найти заголовок ('Content-Disposition).basename ($ file). '"');

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

0 голосов
/ 13 апреля 2011

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

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

0 голосов
/ 13 апреля 2011

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

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

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

...