Загрузка PHP-файла всегда повреждена (50% времени) - PullRequest
1 голос
/ 16 декабря 2010

У меня есть скрипт, который автоматически загружает файл. Он отлично работает для загрузки файла, но проблема в том, что в 50% случаев он загружает поврежденный файл.

Обычно удаление и загрузка снова работают, но не всегда.

Как я могу сделать эту загрузку 100% времени всегда, без повреждений? Размер файла изменяется в зависимости от загружаемого файла.

<?php

// Automatically Start File Download 
if (isset($_GET['filename'])):
    $filename = $_GET['filename'];
    $domain = "http://www.domain.com";
    $filepath = "/addons/downloads/websites/";

     //BUILD THE FILE INFORMATION
     $file = $domain . $filepath . $filename;
     // echo $filepath . $filename;
     // echo $file;

     //CREATE/OUTPUT THE HEADER
    if (file_exists("/home/unrealde/public_html/ebook/domain.com/".$filepath . $filename)):
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);

    else: 
        $errorMsg = "<b>Download Error: File $filename Doesnt Exist!</b> <br />Please Contact <a href='mailto:support@domain.com'>support@domain.com</a>";
    endif;

    echo $errorMsg;

else: 
    // don't download any file
endif;
?>

Ответы [ 3 ]

2 голосов
/ 16 декабря 2010

Я догадываюсь, что что-то в вашей программе выводит некоторые данные, отличные от самого файла.

Вы смотрели на поврежденный файл в бинарном редакторе и сравнивали его с не поврежденной версией? Вы обнаружите, что либо в начале, либо в конце файла у вас есть непредвиденные данные, и именно это портит файл.

Если вы посмотрите этот файл таким образом, может стать очевидным, в чем проблема. Например, у вас может быть файл, за которым следует сообщение об ошибке, и в этом случае, возможно, ваша строка echo $errorMsg; является виновником.

Или у вас может быть свободное место. Это также может быть то же сообщение об ошибке или ваши PHP-теги имеют пустые строки над или под ними, которые печатаются.

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

Это не поможет, если неверные данные отправляются до readfile();, но исключает половину возможных проблем одним махом.

1 голос
/ 16 декабря 2010

Разве вы не можете просто tar / gzip / zip содержимое и предоставить вместо этого файл tar / gzip / zip для загрузки?

Меньшая передача файлов увеличивает шансы на успех по сравнению с передачей http,
и что более важно, вы можете предоставить контрольную сумму пользователю для проверки по

0 голосов
/ 16 декабря 2010

Попробуйте добавить error_reporting (0); в начале сценария. Просто для удовольствия. Если вы проверите php.net для чтения файла, другие сообщили, что это помогает.

...