2013-09-21 8 views
8

Próbuję przesłać plik mp3 do SoundManager nagłówkiem częściowej zawartości HTTP/1.1, aby umożliwić ochronę moich plików multimedialnych, a także umożliwić użytkownikom wyszukiwanie w różnych lokalizacjach utworu. Kod, który mam działa w IE7-10, Firefox, Safari i Opera, ale odmawia pracy w Google Chrome. Gdybym miał usunąć nagłówek Częściowej Treści, zagrałby ten plik, ale nie pozwoliłby użytkownikowi na poszukiwanie.Google Chrome nie wypełnia żądania, jeśli nagłówek częściowej zawartości został ustawiony

Podczas przeglądania karty sieciowej w narzędziach do uruchamiania Chrome są 2 żądania, jedna zostaje zablokowana ze stanem oczekiwania, a druga ma status anulowania. oba te żądania mają rozmiar 13B. Plik, który próbuję odtworzyć, to 9,11 MB.

Poniżej znajduje się kod, którego używam do ustawienia nagłówków i odczytania pliku.

 $name = $_GET['name']; 
     $file_size = filesize($file); 
     $file = "C:\xampp\htdocs\..\protected\music\testsong.mp3"; // song, user and all other checks are performed before this to get the file path. 
     $etag = md5(uniqid(rand(), true)); 

     $open_file = fopen($file, 'rb'); 
     if(!$open_file) throw new Exception('Could not open file'); 

     $start = 0; 
     $end = $file_size - 1; 

     if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])) { 
      $range = explode('-', substr($_SERVER['HTTP_RANGE'], strlen('bytes='))); 

      $start = $range[0]; 
      if($range[1] > 0) $end = $range[1]; 

      header('HTTP/1.1 206 Partial Content'); 
      header('Status: 206'); 
      header('Accept-Ranges: bytes'); 
      header('Content-Range: ' . $_SERVER['HTTP_RANGE'] . '/' . $file_size); 
      header('Content-Length: ' . ($end - $start + 1)); 
     } else header('Content-Length: ' . $file_size); 

     header('Content-Type: ' . $content_type); 
     if($download) header('Content-Disposition: attachment; filename="' . $name . '"'); 
     header('Last-Modified: ' . date('D, d M Y H:i:s \G\M\T', filemtime($file))); 

     header('ETag: "' . $etag . '"'); 
     header('Expires: 0'); 
     header('Pragma: no-cache'); 
     header('Cache-Control: must-revalidate'); 

     if($start > 0) fseek($open_file, $start); 

     $bytes_position = $start; 
     while(!feof($open_file) && $bytes_position <= $end) { 
      if(connection_aborted() || connection_status() != 0) throw New Exception('Connection Aborted'); 

      $chunk = 1048000; 
      if($bytes_position + $chunk > $end + 1) $chunk = $end - $bytes_position + 1; 

      $chunk = fread($open_file, $chunk); 
      if(!$chunk) throw New Exception('Could not read file'); 

      print($chunk); 
      flush(); 

      $bytes_position += $chunk; 
     } 

     fclose($open_file); 
+0

Mam ten sam problem z MP4 streamingu .. http://stackoverflow.com/questions/25975943/php-serve-mp4-chrome-provisional-headers-are-shown-request-is-not-finished-ye. Czy rozwiązałeś urs przez przypadek? –

+0

Sprawdź przepływność plików, które próbujesz przesyłać strumieniowo. Miałem ten sam problem, ale dla mnie żądania zakończyły się dobrze, gdy zacząłem kompresować wszystkie moje pliki audio do 128kbps. – arian1123

Odpowiedz

1

jestem całkiem pewien problem masz jest z nagłówka zawartość zasięgu

spróbuj zamiast tego

header('Content-Range: bytes ' . $start . '-' . $end . '/' . $file_size); 
Powiązane problemy