скачать большие файлы MKV с помощью сценария PHP - PullRequest
1 голос
/ 07 марта 2012

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

  • Скрипт отлично работает для файлов AVI как в Firefox, так и в Chrome (если я изменяю тип контента на video / 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Решение:

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

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

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

0 голосов
/ 07 марта 2012

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

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

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

 $filename = pathinfo($filePath, PATHINFO_BASENAME);
 header("Content-Disposition: attachment; filename=\"$filename\"");
...