2012-02-11 2 views
3

Можно ли принудительно загрузить удаленный файл на PHP без его чтения в память? Я знаю, что fpassthru(), readfile(), file_get_contents() все считывает файлы в память перед выводом их в браузер.PHP принудительно загружает удаленный файл без чтения в память

Вот мой код:

if($url = getRemoteFileURL($file_id)) 
{ 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="abc.zip"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Pragma: no-cache'); 

    readfile($url); // is there a better function ? 
} 

Я не хочу, чтобы сделать заголовок («Location:»), потому что раскроет URL

+0

Вы можете использовать выборочный выбор удаленного файла и вырезать фрагменты. Но для этого потребуется несколько HTTP-запросов из вашего скрипта и быть довольно неэффективным. –

ответ

2

Если вы делаете header("Location: ..."); к загруженному файлу, то URL-адреса на самом деле не показаны много, если вообще.

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

+0

URL-адрес раскрывается всем, кто достаточно сообразителен, чтобы открыть Инспектор, а иногда это неприемлемо. Кроме того, вы не можете контролировать имя файла, если вы это сделаете. –

+0

Да Алек прав. В Chrome все, что вам нужно сделать, это просто перейти на страницу текущих загрузок, и вы увидите URL-адрес. Кроме того, readfile заставляет скрипт работать до тех пор, пока файл загружается. Не очень эффективная ИМО. Например, если бы я загружал 1 ГБ-файл в течение 30 минут, скрипт будет работать в течение 30 минут (не знаю, будут ли некоторые серверы тайм-аутом для того, чтобы скрипт работал так долго) – peter

+0

По умолчанию максимальное время выполнения скрипта PHP составляет 30 секунд ... поэтому да, что не будет работать со значением по умолчанию. – chris342423

Смежные вопросы