Php exec и вернуть двоичный файл

Я пытаюсь запустить следующее в php

$ тест = svn cat ....

Теперь вывод $test в основном представляет собой двоичный файл, возвращаемый svn. Как сделать этот двоичный файл доступным для загрузки. Пытаюсь поставить следующее:

$test = `svn cat ....`
header("Content-Disposition: attachment; filename=" . urlencode($filename));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
echo $test;

person Alec Smart    schedule 21.04.2009    source источник


Ответы (5)


Из комментариев к документации PHP.net по passthru():

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"myfile.zip\"");
header("Content-Length: 11111");
passthru("cat myfile.zip",$err);
exit();

Приведенный выше код был предоставлен igor из bboy dot ru.

person Calvin    schedule 21.04.2009

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

Моя рекомендация: сохраните файл во временном месте, доступном для вашего веб-сервера, и дайте им ссылку.

person Peter D    schedule 21.04.2009

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

Попробуйте сначала с простым текстовым файлом, если это сработает; попробуйте с вашим бинарным файлом.

person Jake    schedule 21.04.2009

Вероятно, вы захотите использовать функцию passthru() в PHP.

Возможно, вызов должен идти после заголовков, но сначала попробуйте оба способа.

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

person Matt    schedule 21.04.2009

Проблема может заключаться в том, что у вас есть три заголовка типа контента - насколько я знаю, браузеры принимают только один, поэтому я бы выбрал поток октетов.

person Adam Hopkinson    schedule 21.04.2009