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

StackOverflow https://stackoverflow.com/questions/539548

Вопрос

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

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 секунд я просто получаю пустую страницу, которая выглядит так, будто файл загружается, но мне его не передает.

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

Это было полезно?

Решение

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

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

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

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

error_reporting(E_ALL | E_STRICT);

Другие советы

Вам не обязательно использовать 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']]);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top