Как я могу разрешить загрузку приостановить / возобновить? - PullRequest
7 голосов
/ 24 мая 2009

Обычно, когда я хочу разрешить пользователю загружать файл без указания точного местоположения, я просто использую что-то вроде этого, чтобы позволить ему загрузить файл:

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . $filename) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($filename));
readfile("$filename");

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

Как мне разрешить моему сценарию компенсировать приостановленные (и, соответственно, возобновленные) загрузки?

Ответы [ 2 ]

10 голосов
/ 24 мая 2009

Используйте встроенный fpen в php, чтобы открыть файл, а затем fseek в нужное место (на основе диапазона в заголовке запроса), а затем вернуть частичный файл, используя fpassthru вместо readfile.

Вы можете найти пример кода в php под комментариями для fread

5 голосов
/ 24 мая 2009

Вам необходимо прочитать заголовки запроса, такие как Range, If-Range и т. Д., А затем найти правильное местоположение в файле. Обычно веб-сервер сделает это за вас в обычном файле. Это немного сложно, но вот кое-что, с чего можно начать:

http://forums.asp.net/t/1218116.aspx

http://www.notes411.com/dominosource/tips.nsf/0/480C4E3BE825F69D802571BC007D5AC9!opendocument

Для второй ссылки код в части 12

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