В моем chunksize не хватает кусков - скрипт загрузки PHP приводит к загрузке файла размером 20% - PullRequest
1 голос
/ 21 марта 2011

Попытка загрузить весь файл - но я предполагаю, что сценарий завершается с первым проходом размера фрагмента в потоке.

Что нужно кодировать, чтобы получить полный размер файла для загрузки?

$image_link=$_GET['image_link'];
$fullPathDL=$path0.$image_link;
$fsize = filesize($fullPathDL);
$path_parts = pathinfo($fullPathDL);
if ($fd = fopen($fullPathDL, "rb")) {
    $fsize = filesize($fullPathDL);
    header("Content-type: application/jpg"); // add here more headers for diff. extensions
    header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
    header("Content-length: $fsize");
    //    header("Cache-control: private"); //use this to open files directly
        while(!feof($fd)) {</p>

<code>        $buffer = fread($fd, 8192); 

        echo $buffer;
    }

fclose ($fd);
exit;
</code>

}

1 Ответ

2 голосов
/ 21 марта 2011

Причина, по которой ваш пример не работает, полностью присутствует в буфере. Прошло некоторое время с тех пор, как я посмотрел на стандарт, но, по крайней мере, я могу дать вам шаг в правильном направлении. По сути, при чтении из chunked-Transfer первые пару байтов, на мой взгляд, представляют количество байтов в чанке. Примерно так (взято из википедии).

25
This is the data in the first chunk

1C
and this is the second one

3
con
8
sequence
0

Вам необходимо проверить количество байтов для чтения, прочитать байты и повторять до тех пор, пока число байтов для чтения не станет равным 0.

Самый простой способ сделать это - указать в заголовке запроса HTTP 1.0 (который не поддерживает частичную передачу) или использовать библиотеку, которая обрабатывает это для вас, т. Е. CURL.

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