PHP выходной файл с диска в браузер - PullRequest
17 голосов
/ 08 января 2010

Я хочу подать существующий файл в браузер на PHP. Я видел примеры использования image / jpeg, но эта функция, кажется, сохраняет файл на диск, и вам нужно сначала создать объект изображения правильного размера (или я просто не понимаю его):))

В asp.net я делаю это, читая файл в байтовом массиве, а затем вызываю context.Response.BinaryWrite (bytearray), поэтому я ищу что-то похожее в PHP.

Michel

Ответы [ 5 ]

29 голосов
/ 08 января 2010

Существует fpassthru () , который должен делать именно то, что вам нужно. Смотрите запись в руководстве, чтобы прочитать о следующем примере:

<?php

// open the file in a binary mode
$name = './img/ok.png';
$fp = fopen($name, 'rb');

// send the right headers
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));

// dump the picture and stop the script
fpassthru($fp);
exit;

?>

См. здесь для всех функций файловой системы PHP.

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

11 голосов
/ 07 апреля 2014

Я использую это

  if (file_exists($file)) {


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

        ob_clean();
        flush();
        readfile($file);
        exit;

    } 
3 голосов
/ 08 января 2010

Я использую readfile () (http://www.php.net/readfile) ...

Но вы должны убедиться, что вы установили правильный "Content-Type" с header (), чтобы браузер знал, что делать с файлом.

Вы также можете заставить браузер загружать файл вместо того, чтобы пытаться использовать плагин для его отображения (например, для PDF), я всегда считал, что это выглядит немного «хакерским», но это объясняется выше. ссылка.

2 голосов
/ 08 января 2010

Это должно помочь вам начать: http://de.php.net/manual/en/function.readfile.php

Редактировать: если ваш веб-сервер поддерживает это, используйте

header('X-Sendfile: ' . $filename);

где имя файла содержит локальный путь, например

/var/www/www.example.org/downloads/example.zip

быстрее readfile ().

(применяются обычные правила безопасности для использования header ())

1 голос
/ 08 января 2010

Как для своего веб-сайта, так и для веб-сайтов, которые я создаю для клиентов, я использую скрипт PHP, который я нашел очень давно.

Его можно найти здесь: http://www.zubrag.com/scripts/download.php

Я используюнемного измененная версия, чтобы позволить мне обфусцировать структуру файловой системы (что она делает по умолчанию), в дополнение к запрету горячих ссылок (по умолчанию), и я добавил некоторые дополнительные функции отслеживания, такие как реферер, IP (по умолчанию) и другиетакие данные, которые мне могут понадобиться, если что-то появится.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...