PHP Pass File Handle для пользователя, так что файл загружается и сохраняется на его компьютере - PullRequest
0 голосов
/ 12 февраля 2009

Я загружаю файл с другого сервера. Я хочу передать этот файл своим пользователям, а не сохранять его на моем сервере.

Другими словами, передайте им дескриптор файла, чтобы он просто проходил через мой сервер и сохранялся на их машине. Как я могу это сделать? У меня есть это до сих пор:

$handle = fopen($_GET['fileURL'], 'r');
$filename = stream_get_contents($handle);

Как мне передать это пользователю, возможно, используя заголовки?

Спасибо за любую помощь и направление.

EDIT

У меня есть заголовки:

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");

Просто он не толкает заголовки. Примерно через 15 секунд я просто получаю пустую страницу, которая выглядит так, как будто она загружает файл, но не дает его мне.

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

Ответы [ 2 ]

4 голосов
/ 12 февраля 2009

Вы можете попробовать это

$filetype = mime_content_type($filename);
header('Content-type: '.$filetype);
header('Content-Disposition: attachment; filename="'.$filename.'"');

ОБНОВЛЕНИЕ для вашего РЕДАКТИРОВАНИЯ:

У вас отключены ошибки, так как это звучит так, как будто заголовки уже отправили ошибку?

error_reporting(E_ALL | E_STRICT);
0 голосов
/ 12 февраля 2009

Вам не нужно использовать fopen () при использовании readfile ();

Просто включите имя файла в readfile () следующим образом:

readfile($_GET['fileUrl']);

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

Вот пример массива:

$files = array('file1.jpg', 'file2.png', 'file3.pdf');
//assume $_GET['file_id'] == 0, 1 or 2

if (file_exists($files[$_GET['file_id']]))
    readfile($files[$_GET['file_id']]);
...