php force download показывает мусор на экране - PullRequest
2 голосов
/ 15 декабря 2011

Я пытаюсь загрузить zip-файл из папки / tmp в Ubuntu.Однако, когда я запускаю код Php, он отображает текст мусора в браузере, а не показывает окно загрузки.Я попытался с простым текстовым файлом и вместо того, чтобы показать мне диалоговое окно загрузки, он напечатал его содержимое в браузере.Почему эта принудительная загрузка не работает.Ниже приведен код.

if (file_exists($dir.$filename)) {
            header("Content-type: application/force-download");
            header("Content-Transfer-Encoding: Binary");
            header("Content-length: ".filesize($dir.$filename));
            header('Content-disposition: attachment; filename='.basename($dir.$filename));
            readfile($dir.$filename);
            exit(0);
        }

    `    

Ответы [ 2 ]

4 голосов
/ 15 декабря 2011

Что ж, при наличии в любом браузере MIME-типа «application / force-download» браузер не будет знать, что с ним делать.

Поскольку это zip-файл, тип MIME должен быть «application / octet-stream» или «application / zip».

if (file_exists($dir . $filename)) {
        header("Content-type: application/zip");
        header("Content-Transfer-Encoding: Binary");
        header("Content-length: " . filesize($dir . $filename));
        header('Content-disposition: attachment; filename=' . basename($dir . $filename));
        readfile($dir . $filename);
        exit(0);
    }
0 голосов
/ 03 мая 2014

Вы не можете прочитать весь файл в память. Измените ваш файл для чтения ($ _ REQUEST ['file']); в:

$handle=fopen($_REQUEST['file'], 'rb');
while (!feof($handle))
{
    echo fread($handle, 8192);
    flush();
}
fclose($handle);

Это прочитает 8 КБ файла, затем отправит его клиенту и так далее ... Он будет занимать не так много памяти (так как не читает весь файл сразу).

Также при принудительной загрузке всегда используйте application/octet-stream, это обеспечит правильную отправку двоичных файлов.

...