скачать большие файлы mkv с помощью php-скрипта

После некоторого тестирования с приведенным ниже кодом я пришел к такому выводу:

  • Скрипт отлично работает с файлами AVI как в Firefox, так и в Chrome (если я, конечно, изменю тип контента на видео/avi)
  • Скрипт отлично работает с файлами MKV в Chrome. Однако Firefox выдает мне сообщение об ошибке (см. ниже)
  • Я скачал большой тестовый файл размером 20 МБ (test7.mkv) с http://matroska.org/downloads/test_w1.html для тестирования с файлом меньшего размера. Как ни странно, Firefox может загрузить этот файл, и, похоже, он работает. Однако, если я попробую это на большом файле размером 6 ГБ, я получу ошибку Firefox, которую вы видите ниже.
  • Редактировать: Скачал файл размером 700 МБ, который вообще не воспроизводился в SM-плеере (код выхода 1), но отлично воспроизводился в VLC-плеере. В настоящее время я ищу способ узнать, как и где файл может быть поврежден.

У меня очевидный вопрос: что я делаю не так? Как правильно загрузить файл mkv в firefox или лучше в любом обычном браузере, если на то пошло. Я не могу найти ничего полезного в Google, но, возможно, я просто ищу не в том месте.

Ошибка Firefox при попытке загрузить файл mkv:

Ошибка поврежденного содержимого

Страница, которую вы пытаетесь просмотреть, не может быть показана, так как обнаружена ошибка передачи данных.

Страница, которую вы пытаетесь просмотреть, не может быть показана, так как обнаружена ошибка передачи данных. Пожалуйста, свяжитесь с владельцами сайта, чтобы сообщить им об этой проблеме.

    function download($file)
    {
        $path = $_SERVER['DOCUMENT_ROOT']; //<-- added the relative part after that 
        $fullPath = $path.$file;
        set_time_limit(0);
        if ($fd = fopen ($fullPath, "r")) 
        {
        $fsize = filesize($fullPath);
        $path_parts = pathinfo($fullPath);
        $ext = strtolower($path_parts["extension"]);

        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Type: video/x-matroska");
        header("Content-Disposition: attachment; filename=\"$file\""); 
        header("Content-Transfer-Encoding: binary");
        header("Content-length: $fsize");

        $file = @fopen($fullPath,"rb");
        if ($file) 
        {
            while(!feof($file)) 
            {
                print(fread($file, 1024*8));
                flush();
                if (connection_status()!=0) 
                {
                    @fclose($file);
                    die();
                }
            }
            @fclose($file);
        }
        exit;
    }
}

person wacki    schedule 06.03.2012    source источник
comment
Посмотрите исходный код поврежденного файла. Вероятно, вы найдете там сообщение об ошибке PHP.   -  person Pekka    schedule 07.03.2012
comment
какой файл, разве установка такого заголовка просто не предлагает пользователю загрузить файл в $filePath? Браузер пишет, что файл поврежден. Я не получаю никаких сообщений php.   -  person wacki    schedule 07.03.2012
comment
Скачанный файл. Загляните внутрь.   -  person Pekka    schedule 07.03.2012
comment
Что содержит $filePath?   -  person Pekka    schedule 07.03.2012
comment
Вы, вероятно, найдете там сообщение об ошибке PHP — Firefox даже не заходит так далеко, он просто выдает сообщение об ошибке, которое я разместил выше. Так что никакого устранения неполадок оттуда.   -  person wacki    schedule 07.03.2012
comment
@ user1232791 просто используйте встроенные инструменты отладки Firefox. Его можно найти по F12. Там вы видите, что он делает. Что такое заголовки ответа и все такое.   -  person Daan Timmer    schedule 07.03.2012


Ответы (2)


абсолютный путь к файлу mkv на сервере

Firefox может задыхаться от абсолютного пути в значении заголовка filename.

Вместо этого попробуйте указать просто имя файла:

 $filename = pathinfo($filePath, PATHINFO_BASENAME);
 header("Content-Disposition: attachment; filename=\"$filename\"");
person Pekka    schedule 06.03.2012

Решение:

Я должен был проверить, установлены ли переменные, которые я определяю, в ожидаемые значения. Оказывается, png() возвращает 32-битное целое число со знаком.

Пока я просто взял показанную здесь функцию: https://stackoverflow.com/a/5502328/1232791

Другим возможным решением было бы не определять заголовок длины содержимого. Однако с этим решением клиент не будет знать, сколько времени займет его загрузка.

person wacki    schedule 07.03.2012