Динамические имена файлов с Apache mod_header и загрузки файлов с использованием Content-Disposition - PullRequest
0 голосов
/ 24 февраля 2011

У меня возникла серьезная проблема на моем сайте, когда загрузка файлов обрезается, когда я использую PHP, чтобы установить для Content-Disposition значение «attachment», а затем отправляю файл с помощью readfile().Я знаю, что это в некоторой степени печально известная проблема, так как на странице руководства PHP readfile() есть множество дискуссий.Я попробовал каждое из опубликованных там решений безуспешно (отправка чанкованного вывода, отключение сжатия gzip в обоих Apache / PHP).Вот суть этого кода без всех обходных путей, как вы могли бы найти его в руководстве по PHP:

$file = '/path/to/ugly.file.name.mp4';
$filename = 'ANiceFileName.mp4';
header('Content-Description: File Transfer');
header('Content-Type: video/mp4');
header('Content-Disposition: attachment; filename='.$filename.'.mp4');
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);

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

Единственный надежный способ отправить полный файл - это просто очистить PHP и вместо этого использовать Apache mod_header для принудительной загрузки файла.Вот так:

<FilesMatch "\.mp4$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

Это работает очень хорошо, но есть большая проблема - я больше не могу генерировать динамические имена файлов по запросу, что несколько важно для моего контента.Я уже знаю об указании ;filename=file_name.mp4, но помните - мне нужно указать динамическое имя, а не просто file_name.mp4.

Было бы очень хорошо, если бы я мог как-то уведомить Apache (используя PHP) о динамическомимя файла при отправке файла.Это возможно?Или я буду вынужден переименовать все мои файлы на диске в понятное имя?Решения PHP просто не работают вообще.Мои файлы иногда имеют размер до 15 МБ, а при передаче они часто усекаются до размера менее 2 МБ.Ой!

Помоги мне переполнить стек Кеноби!Ты моя единственная надежда.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2011

Попробуйте mod_xsendfile, как описано здесь . Это в основном позволяет PHP выйти из середины HTTP-разговора в тот момент, когда PHP устанавливает заголовок X-Sendfile, но, как вы можете видеть в этом блоге, он позволяет устанавливать заголовок Content-Disposition.

0 голосов
/ 24 февраля 2011

Это обрезается, потому что время ожидания php-скрипта истекло?set_time_limit

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