madmaker
@madmaker
Full stack программист

Загрузка файла с сервера на php. Почему браузер считает, что размер файла больше, чем он есть?

$this->file_size равен filesize($this->file_addr) , а это 1163748924 (1,08ГБ)

Но браузер считает, что файл равен 1,16.
f27290154b0e49d48145c7a70a122f52.png

Как я вижу, что если количество байт перевести в Гигабайты посредством деления на 1024, получится 1,08 (реальный размер файла), а если посредством деления на 1000, то получится 1,16. Выдал браузеру (int)$file_size/1024/1024/1024*1000*1000*1000 - он увидел 1.08 ГБ, но это ни на что не повлияло.
430f3bc15cf943f38ebfae2f524d44a2.png

Если заголовок Content-length убрать, то загрузка отрабатывает.
С файлами в 500 МБ, 50 МБ и меньше все отрабатывает. В файлах размером 1,08, 1,16, 1,27 ГБ встречается описанная проблема.

Проблема в следующем: сервер отдает браузеру файл до конца и отключается, как и положено. Но Браузер думает, что файл передали не до конца и считает, что передача не удалась. При этом размер загруженного файла и есть 1,08 и он спокойно открывается.

Такое предположение появилось, что после того, как файл передан до конца, браузер ожидает еще что-то от сервера, а сервеер просто завершает работу.

Вот код сервера:
header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="'.$this->file_name.'"');
        header('Content-Length: ' . $this->file_size);
        flush();

        ignore_user_abort(false);
        ini_set('output_buffering', 0);
        ini_set('zlib.output_compression', 0);

        ob_end_flush();
        $handle = fopen($this->file_addr, "rb");
        while (!feof($handle)){
            echo fread($handle, 8192);
            ob_flush();  // flush output
            flush();
        }
        fclose($handle);


Вот заголовки:
Cache-Control	
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection	
keep-alive
Content-Description	
File Transfer
Content-Disposition	
attachment; filename="Файл_1.tif"
Content-Length	
1163748924
Content-Type	
image/tiff
Date	
Wed, 18 May 2016 13:35:20 GMT
Expires	
Thu, 19 Nov 1981 08:52:00 GMT
Pragma	
no-cache
Server	
nginx
X-Powered-By	
PHP/5.4.45-0+deb7u2
content-transfer-encoding	
binary
  • Вопрос задан
  • 367 просмотров
Решения вопроса 1
madmaker
@madmaker Автор вопроса
Full stack программист
В общем вопрос в мае, ответ на него в сентябре:
строчка "ob_end_flush();"
и "ob_flush();" не отрабатывала и валила ошибку. Как результат - размер файла, который выдается браузеру, увеличивался (так как в теле файла помимо самого файла была куча строк с ошибками php).
Как-то так.

Отсюда: если у вас download файла получается больше, чем он весит на сервере, то проверяйте, что ж там такого в контенте файла лишнего.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
alsopub
@alsopub
Возможно $this->file_size по какой-то причине не совпадает с реальным размером $this->file_addr ?
И попробуйте убрать header('Accept-Ranges: bytes');, вы же докачку не стали реализовывать.
На всякий случай добавлю ссылку - https://habrahabr.ru/post/151795/ может пригодится.
Ответ написан
BuriK666
@BuriK666
Компьютерный псих
Используйте nginx и x-accel-redirect
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы