2012-03-06 1 views
1

После некоторого тестирования с кодом ниже я пришел к такому выводу:загрузить большие файлы MKV с PHP скрипт

  • Сценарий прекрасно подходит для AVI файлов как светлячок и хром работает (если я изменить тип содержимого к видео/avi, конечно)
  • Скрипт отлично работает для файлов MKV в Chrome. Firefox выдает сообщение об ошибке на моем лице (см. Ниже)
  • Я загрузил большой тестовый файл размером 20 мб (test7.mkv) от http://matroska.org/downloads/test_w1.html, чтобы протестировать его с меньшим файлом. Странно Firefox может загрузить этот файл, и он, похоже, работает. Однако, если я попробую его на большом файле размером 6 ГБ, я получаю ошибку firefox, которую вы видите ниже.
  • Редактирование: Загружен файл 700 МБ, который вообще не играл в SM-проигрывателе (exitcode 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

Просмотрите исходный код поврежденного файла. Вероятно, вы найдете сообщение об ошибке PHP. –

+0

какой файл, не настраивая заголовок, как это, просто попросит пользователя загрузить файл в $ filePath? Браузер говорит мне, что файл поврежден. Я не получаю никаких php-сообщений. – wacki

+0

Загруженный файл. Загляните внутрь. –

ответ

0

Решение:

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

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

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

0

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

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

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

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