Linux — передача файлов PHP — Как это работает?

Итак, в другом ВОПРОС, Я получил этот ответ:

$filename="filetodownload.xyz";
$cf = realpath("/non-webaccessible-folder/".$filename);
$file=$cf;

header('Content-Disposition: attachment; filename="' . basename($cf) . '"');
header("Content-Length: " . filesize($cf));
header("Content-Type: application/octet-stream");
readfile(realpath($cf));

Я смог заставить его работать в моих целях, просто используя верхнюю строку заголовка:

header('Content-Disposition: attachment; filename="' . basename($cf) . '"');

У меня есть несколько вопросов по поводу всего решения, чтобы улучшить мое понимание:

1. Является ли целью использования basename() просто убрать путь из имени файла?

2. Какова цель realpath()? В моем использовании, кажется, нет никакой разницы. Основываясь на том, что я нашел, кажется, что он просто «стандартизирует» входные данные filepath. Это верно?

3. Мне не нужны последние три строки, чтобы сделать эту работу:

header("Content-Length: " . filesize($cf));

header("Content-Type: application/octet-stream");

readfile(realpath($cf));

Они нужны мне? Что они делают? Я должен отметить, что я тестирую только с использованием localhost, на случай, если что-то изменится.

Есть ли какие-либо соображения безопасности, которые я должен учитывать при использовании этого метода для обеспечения загрузки файлов?

0

Решение

Является ли целью использование basename () просто для удаления пути из
имя файла?

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

Какова цель realpath ()? В моем использовании, кажется, нет
разница вообще. Исходя из того, что я нашел, кажется, просто
«стандартизировать» входы filepath. Это верно?

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

Мне не нужны последние три строки, чтобы сделать эту работу:

заголовок («Длина содержимого:». Размер файла ($ cf));

заголовок («Content-Type: application / octet-stream»);

ReadFile (Realpath ($ сравни));

Они нужны мне? Что они делают? Должен отметить, что я тестирую только
используя localhost, в случае, если это имеет значение.

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

Я также не думаю, что загрузка будет работать без последней строки … Вот что на самом деле читает файл с помощью PHP и отправляет его в ваш браузер. Если вы пропустите это, вы, вероятно, в конечном итоге загрузите пустой файл.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]