$this->file_size равен filesize($this->file_addr) , а это 1163748924 (1,08ГБ)
Но браузер считает, что файл равен 1,16.
Как я вижу, что если количество байт перевести в Гигабайты посредством деления на 1024, получится 1,08 (реальный размер файла), а если посредством деления на 1000, то получится 1,16. Выдал браузеру (int)$file_size/1024/1024/1024*1000*1000*1000 - он увидел 1.08 ГБ, но это ни на что не повлияло.
Если заголовок 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