Я пытаюсь запустить следующее в php
$ test = 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;
Из комментариев к документации 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.
Вы считали сохранение этого файла во временном месте на жестком диске и обслуживании его оттуда? Действительно ли необходимо обслуживать файл из памяти? Что делать, если у вас 500 человек, загружающих этот файл. Будет ли сервер сохранять все 500 файлов в памяти, пока пользователи загружают их?
Моя рекомендация сохраните файл во временное место, доступное вашему веб-серверу, и дайте им ссылку.
В дополнение к ответу Питера D; вы можете записать двоичный файл в файловую систему, а затем выполнить его как загрузку. Вместо того, чтобы давать пользователям ссылку.
Сначала попробуйте его с помощью простого текстового файла, если это работает; попробуйте его с вашим двоичным файлом.
Вероятно, вы хотите использовать функцию passthru () в PHP.
Возможно, вызов должен появиться после заголовков, но сначала попробуйте оба способа.
edit: Я не думаю, что это вызовет проблему с памятью. Я не думаю, что PHP будет хранить вывод в памяти, потому что он отправляется прямо в stdout.
Проблема может заключаться в том, что у вас есть три заголовка контента – насколько я знаю, браузеры принимают только один, поэтому я бы пошел на поток октетов.