2013-09-21 21 views
8

Ortam dosyalarına bazı koruma sağlamak ve kullanıcıların farklı konumlarda arama yapmasına izin vermek için bir mp3 dosyasını SoundManager'a HTTP/1.1 Kısmi İçerik üstbilgisi ile akıtmaya çalışıyorum parçanın IE7-10, Firefox, Safari ve Opera'da çalıştığım ancak Google Chrome'da çalışmayı reddettiğim kod. Kısmi İçerik üstbilgisini kaldırırsam, dosyayı oynatır ancak kullanıcının aramasına izin vermez.Google Chrome, bir Kısmi İçerik üstbilgisi ayarlandıysa isteği tamamlamıyor

Chrome'un dev araçlarındaki ağ sekmesini incelerken 2 istek var, biri beklemede kalıyor, diğeri de iptal edildi. Bu taleplerin her ikisi de 13B büyüklüğündedir. Oynamaya çalıştığım dosya 9.11MB.

Başlıkları ayarlamak ve dosyayı okumak için kullanıyorum kod aşağıdadır.

 $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

yaşıyorum aynı sorunu deneyin yaşadığınız sorun içeriği menzilli başlığında

ile eminim .. http://stackoverflow.com/questions/25975943/php-serve-mp4-chrome-provisional-headers-are-shown-request-is-not-finished-ye. Urs'u herhangi bir şansla çözdün mü? –

+0

Akış yapmaya çalıştığınız dosyaların bit hızını kontrol edin. Aynı sorunu yaşadım, ancak tüm ses dosyalarımı 128kbps'ye sıkıştırmaya başladığımda talepler sadece iyi tamamlandı. – arian1123

cevap

1

Ben MP4 akışı ile bu yerine

header('Content-Range: bytes ' . $start . '-' . $end . '/' . $file_size); 
İlgili konular