одновременно скачивать на сервер и на пользователя - PullRequest
2 голосов
/ 11 декабря 2011

В настоящее время я разрабатываю приложение на PHP, в котором мой сервер (выделенный сервер) должен загрузить файл, а пользователь должен загрузить файл одновременно.

Вот пример:

  • Сервер начинает загружать файл одновременно A .
  • Пользователь хочет загрузить этот файл одновременно A + 3 секунды (например)

Я уже решил проблему: « Если пользователь загружает файл быстрее, чем сервер .. ».Но я не знал, как сделать php-скрипт, в котором пользователь собирается загрузить полный файл (это означает, что размер должен соответствовать полному размеру файла, а не размеру, который он загружает в данный момент A + 3 секунды).Я уже сделал это:

header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="'.$data['name'].'";'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: '.$data['size']);
readfile($remoteFile);

Но это не сработает, пользователь будет загружать только тот размер, который в данный момент находится на сервере (который повредил файл), а не полный файл ...

Если у вас есть решение, спасибо.

Ответы [ 3 ]

3 голосов
/ 11 декабря 2011

Возможно, вы могли бы передать файл вручную, открыв соединение и читая, пока вы не пройдете все заголовки. Затем, как только вы выяснили Content-Length, отправьте это пользователю и просто echo все оставшиеся данные, которые вы получите (используйте flush() и избегайте выходных буферов).

псевдокод (-ish):

open the file
# grab headers
while you didn't get all HTTP headers:
    read more
look for the Content-Length header
send the Content-Length header

# grab the file
while the rest of the request isn't done
    read more
    send it to the user
    flush the buffers

done
1 голос
/ 11 декабря 2011

Расширяя ответ @ Tom , вы можете использовать cURL, чтобы значительно упростить алгоритм, используя обратные вызовы CURLOPT_HEADERFUNCTION и CURLOPT_READFUNCTION - см. curl_setopt().

0 голосов
/ 11 декабря 2011

Не отправляйте заголовок длины содержимого.Это не обязательно, если вы используете http 1.1 (ваш веб-сервер почти наверняка это делает).Недостатком является то, что их браузер не может показать время загрузки / оставшийся размер.

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