Cкачивание через php Битые архивы

Статус
В этой теме нельзя размещать новые ответы.

invoice

Создатель
Регистрация
22 Дек 2008
Сообщения
45
Реакции
3
Создан файловый архив, стоит Antileech и формирует ссылки на скачивание вида:

Для просмотра ссылки Войди или Зарегистрируйсяdownload.php/48ff263ca925e793775a04cfae920770/Files.rar

В download.php прописан Content Type: application/x-rar-compressed

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

После ряда тестов выявлено следующее: можно исключить ошибки при разархивировании - скачивать архивы браузером Mozilla Firefox или браузером IE через команду ссылки "Save as..." ("Сохранить как...").

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

Content-Disposition: filename="имя_файла"
Content-Length: размер_файла_в_байтах
Connection: close
Content-Type: application/octet-stream
 
Изменил на application/octet-stream, попробовал скачать тем же download master -итог битый архив.
Фрагмент лога из download master:
Referer: Для просмотра ссылки Войди или Зарегистрируйся
Pragma: no-cache
Cache-Control: no-cache
Host: download.innervoice.ru
7 10.01.2009 22:19:27 HTTP/1.1 200 OK
Date: Sat, 10 Jan 2009 19:18:09 GMT
Server: Apache/2.2.9 (FreeBSD) DAV/2 PHP/5.2.6 mod_ssl/2.2.9 OpenSSL/0.9.7e-p1
X-Powered-By: Antileech
Expires: Tue, 1 Jan 1980 00:00:00 GMT
Last-Modified: Sat, 10 Jan 2009 19:18:09 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Accept-Ranges: bytes
Connection: close
Content-Length: 17559490
Content-Type: application/octet-stream

Вот фрагмент download.php

$fp = fopen($fullpath, 'r');
header ('Accept-Ranges: bytes');
header ('Content-Type: application/octet-stream');
header ('Connection: close');

$header = getallheaders();
if (isset($header['Range'])) {
header('HTTP/1.0 206 Partial Content');
$range = $header['Range'];
$r = explode('=', $range);
list($from) = explode('-', $r[1]);
$length = $size - $from;
$s_start = $size - $length;
$s_end = $size - 1;
fseek($fp, $s_start);
header ('Content-Range: bytes '.$s_start.'-'.$s_end.'/'.$size);
header ('Content-Length: '.$length);
} else {
header('Content-Length: '. $size);

Проблема не решена...
 
А архив битый при любом размере файла?
 
ну вот скачал DM или flashget показывает размер файла например 17418 и открывает с ошибками, а скачал мозиллой уже архив весит 17419 и открывается без ошибок.

Добавлено через 1 минуту
Да размер файла не имеет значение, архивы битые как которые весят 20 мегабайт и до 2 гигов
 
Может при отдачи файла ошибки какие вылазят? И архив вместе с текстом ошибок идёт?
 
если браузеры скачивают нормально, а даунлоадеры нет, то скорей всего проблема в скрипте download.php, обеспечивающем многопоточное скачивание, то есть обработку заголовка Range
 
Когда скачивают никаких ошибок не вылазит, как правильно написали, проблема именно с многопоточным скачиванием через менеджеры закачек, то есть все прекрасно работает-качает через них, но только в итоге получаем битый архив.

Что мне вам нужно привести, какой фрагмент из download.php чтобы вы могли посмотреть где ошибка? Если что могу кинуть весь download.php в приват тому, кто сможет разобраться с проблемой. Заранее признателен
 
set_time_limit();
 
}
set_time_limit(0);
ob_implicit_flush(true);
if (empty($MAIN['maxkbps'])) {
while (!feof($fp)) {
print (fread($fp, 10240));
if (connection_aborted()) {
break;
}
}
} else {
$koef = 10;
$readlen = intval(1024 * $MAIN['maxkbps'] / $koef);
$waittime = intval(1000000 / $koef);
while (!feof($fp)) {
if (connection_aborted()) {
break;
}
print (fread($fp, $readlen));
usleep($waittime);
}
}
fclose($fp);
?>


Напишите что неправильно?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху