2013-07-26 2 views
0

Я нашел этот скрипт в php.net, который позволяет пользователям загружать локальный файл. Всякий раз, когда я пытаюсь использовать протокол в начале имени файла, PHP не может найти файл. Я включил allow_url_fopen в php.net. Что делать, чтобы загружать удаленные файлы?Как быстро загрузить удаленный файл в PHP?

Кроме того, загрузка выполняется очень медленно даже с помощью менеджеров загрузки. Есть ли что-то, что я могу сделать, чтобы увеличить скорость загрузки? Есть ли способ разрешить «загрузку резюме» в менеджерах загрузки?

<?php 
$file = 'https://www.example.com/test.exe'; 
if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} else echo "file not found." 
?> 
+1

Если файл загружается медленно, попробуйте увеличить пропускную способность, доступную для сервера, или загрузить пользователя. Запуск этого скрипта будет всегда делать его медленнее, чем пользователь просто загружает файл напрямую – Anigel

+0

вы не добавляете протокол в заголовок вложения, нет необходимости в –

+0

@Anigel: Извините, я должен не согласиться. Средняя загрузка человека может быть быстрее. –

ответ

1

"Resume download" требует использования заголовка Range. Вы должны будете взять этот заголовок из своих заголовков запросов и передать его на задний план при отправке запроса. По-видимому, можно установить заголовки, которые будут отправляться при использовании обертки HTTP-протокола fopen (давайте посмотрим, найду ли я пример этого ...)

Если файл для скачивания является общедоступным через Интернет, почему не переадресовываете ли вы пользователя там с заголовком Location? Это приведет к удалению вашего сервера из пути передачи данных, что, возможно, даст самый быстрый вариант.

Ваш второй лучший вариант - настроить обратный прокси-сервер на веб-сервере, for example with mod_rewrite. Это, по крайней мере, выводит интерпретатор PHP из уравнения.

+0

Мне нужно скрыть реальный URL загрузки от пользователей. Проблема с заголовком «Местоположение» заключается в том, что он показывает URL загрузки в менеджерах загрузки. –

+2

Затем я бы рекомендовал использовать либо выделенный обратный прокси, либо настроить веб-сервер как один – Joni

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