PHP передает дескриптор файла пользователю, чтобы файл загружался и сохранялся на его компьютере.
-
22-08-2019 - |
Вопрос
Я скачиваю файл с другого сервера.Я хочу отправить этот файл своим пользователям, а не сохранять его на своем сервере.
Другими словами, передайте им дескриптор файла, чтобы он просто проходил через мой сервер и сохранялся на их компьютере.Как я могу это сделать?У меня пока это:
$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']]);