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

Тема в разделе "PHP", создана пользователем invoice, 10 янв 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. invoice

    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..." ("Сохранить как...").

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

    Joys Создатель

    Регистр.:
    5 окт 2008
    Сообщения:
    11
    Симпатии:
    0
    Вот такой заголовок при отдаче любых файлов не должен вызывать проблем

    Content-Disposition: filename="имя_файла"
    Content-Length: размер_файла_в_байтах
    Connection: close
    Content-Type: application/octet-stream
     
  3. invoice

    invoice Создатель

    Регистр.:
    22 дек 2008
    Сообщения:
    45
    Симпатии:
    3
    Изменил на 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);

    Проблема не решена...
     
  4. Joys

    Joys Создатель

    Регистр.:
    5 окт 2008
    Сообщения:
    11
    Симпатии:
    0
    А архив битый при любом размере файла?
     
  5. invoice

    invoice Создатель

    Регистр.:
    22 дек 2008
    Сообщения:
    45
    Симпатии:
    3
    ну вот скачал DM или flashget показывает размер файла например 17418 и открывает с ошибками, а скачал мозиллой уже архив весит 17419 и открывается без ошибок.

    Добавлено через 1 минуту
    Да размер файла не имеет значение, архивы битые как которые весят 20 мегабайт и до 2 гигов
     
  6. Lonely Wolf

    Lonely Wolf Прохожие

    Может при отдачи файла ошибки какие вылазят? И архив вместе с текстом ошибок идёт?
     
  7. Jacob

    Jacob

    Регистр.:
    18 окт 2006
    Сообщения:
    257
    Симпатии:
    18
    если браузеры скачивают нормально, а даунлоадеры нет, то скорей всего проблема в скрипте download.php, обеспечивающем многопоточное скачивание, то есть обработку заголовка Range
     
  8. invoice

    invoice Создатель

    Регистр.:
    22 дек 2008
    Сообщения:
    45
    Симпатии:
    3
    Когда скачивают никаких ошибок не вылазит, как правильно написали, проблема именно с многопоточным скачиванием через менеджеры закачек, то есть все прекрасно работает-качает через них, но только в итоге получаем битый архив.

    Что мне вам нужно привести, какой фрагмент из download.php чтобы вы могли посмотреть где ошибка? Если что могу кинуть весь download.php в приват тому, кто сможет разобраться с проблемой. Заранее признателен
     
  9. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    set_time_limit();
     
  10. invoice

    invoice Создатель

    Регистр.:
    22 дек 2008
    Сообщения:
    45
    Симпатии:
    3
    }
    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);
    ?>


    Напишите что неправильно?
     
Статус темы:
Закрыта.