2013-09-21 13 views
8

Sto provando a trasmettere un file mp3 a SoundManager con l'intestazione del contenuto parziale HTTP/1.1 per consentire una certa protezione ai miei file multimediali e anche consentire agli utenti di cercare in posizioni diverse della traccia. Il codice che ho funziona in IE7-10, Firefox, Safari e Opera, ma si rifiuta di lavorare in Google Chrome. Se dovessi rimuovere l'intestazione Content parziale, riprodurrebbe il file ma non consentirebbe all'utente di cercare.Google Chrome non completa la richiesta se è stata impostata un'intestazione Content parziale

Quando si esamina la scheda di rete negli strumenti di sviluppo di Chrome ci sono 2 richieste, una è bloccata con lo stato di in sospeso e l'altra ha lo stato di annullato. entrambe queste richieste hanno una dimensione di 13B. Il file che sto cercando di riprodurre è 9.11 MB.

Di seguito è riportato il codice che sto utilizzando per impostare le intestazioni e leggere il file.

 $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

Sto avendo lo stesso problema con lo streaming MP4 .. http://stackoverflow.com/questions/25975943/php-serve-mp4-chrome-provisional-headers-are-shown-request-is-not-finished-ye. Hai risolto urs per caso? –

+0

Controlla il bitrate dei file che stai provando a trasmettere. Ho avuto lo stesso problema, ma per me le richieste sono state completate correttamente quando ho iniziato a comprimere tutti i miei file audio fino a 128kbps. – arian1123

risposta

1

Sono abbastanza sicuro che il problema che stai avendo è con l'intestazione content-gamma

Prova a modificare la

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