2013-09-21 80 views
8

Tôi đang cố phát một tệp mp3 tới SoundManager bằng tiêu đề Nội dung một phần HTTP/1.1 để cho phép bảo vệ một số tệp phương tiện của mình và cũng cho phép người dùng tìm kiếm các vị trí khác nhau của bản nhạc. Mã tôi đã làm việc trong IE7-10, Firefox, Safari và Opera nhưng từ chối làm việc trong Google Chrome. Nếu tôi đã xóa tiêu đề Nội dung một phần, nó sẽ phát tệp nhưng sẽ không cho phép người dùng tìm kiếm.Google Chrome không hoàn thành yêu cầu nếu tiêu đề Nội dung một phần được đặt

Khi kiểm tra tab mạng trong các công cụ tìm kiếm của Chrome có 2 yêu cầu, một yêu cầu bị kẹt với trạng thái đang chờ xử lý và trạng thái bị hủy khác. cả hai yêu cầu này đều có kích thước 13B. Tệp tôi đang cố gắng phát là 9,11MB.

Dưới đây là mã tôi đang sử dụng để đặt tiêu đề và đọc tệp.

 $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

Tôi đang gặp vấn đề tương tự với MP4 trực tuyến .. http://stackoverflow.com/questions/25975943/php-serve-mp4-chrome-provisional-headers-are-shown-request-is-not-finished-ye. Bạn đã giải quyết urs bởi bất kỳ cơ hội? –

+0

Kiểm tra tốc độ bit của các tệp bạn đang cố phát trực tuyến. Tôi đã có vấn đề tương tự, nhưng đối với tôi các yêu cầu hoàn thành tốt khi tôi bắt đầu để nén tất cả các tập tin âm thanh của tôi xuống 128kbps. – arian1123

Trả lời

1

Tôi khá chắc chắn rằng các vấn đề bạn đang gặp phải là với tiêu đề nội dung tầm

thử này để thay thế

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