Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to send file or use cache for mp3 files in php
    primarykey
    data
    text
    <p>I have a php script that streams an mp3 file to the browser. I was wondering if there was a way for the browser to cache the song once played and then if not, then stream the file. I have included the function that I use to stream the mp3 files. As well as the HTML in how I implement the php script. I use a .htaccess file to get the ID of the song and then stream that based one what song it is in a database. I was imaging something to do with 304 headers correct? If anyone could possibly guide me? Thanks.</p> <p>PHP:</p> <pre><code>private function send_file($file, $name, $contenttype = "application/octet-stream") { // Make sure the files exists, otherwise we are wasting our time if (!file_exists($file)) { error_log('file not found'); header("HTTP/1.1 404 Not Found"); exit; } // Get the 'Range' header if one was sent if (isset($_SERVER['HTTP_RANGE'])) $range = $_SERVER['HTTP_RANGE']; // IIS/Some Apache versions else if ($apache = apache_request_headers()) { // Try Apache again $headers = array(); foreach ($apache as $header =&gt; $val) $headers[strtolower($header)] = $val; if (isset($headers['range'])) $range = $headers['range']; else $range = FALSE; // We can't get the header/there isn't one set } else $range = FALSE; // We can't get the header/there isn't one set // Get the data range requested (if any) $filesize = filesize($file); if ($range) { $partial = true; list($param,$range) = explode('=',$range); if (strtolower(trim($param)) != 'bytes') { // Bad request - range unit is not 'bytes' error_log('range unit not in bytes'); header("HTTP/1.1 400 Invalid Request"); exit; } $range = explode(',',$range); $range = explode('-',$range[0]); // We only deal with the first requested range if (count($range) != 2) { // Bad request - 'bytes' parameter is not valid error_log('bytes range parameter is not valid'); header("HTTP/1.1 400 Invalid Request"); exit; } if ($range[0] === '') { // First number missing, return last $range[1] bytes $end = $filesize - 1; $start = $end - intval($range[0]); } else if ($range[1] === '') { // Second number missing, return from byte $range[0] to end $start = intval($range[0]); $end = $filesize - 1; } else { // Both numbers present, return specific range $start = intval($range[0]); $end = intval($range[1]); if ($end &gt;= $filesize || (!$start &amp;&amp; (!$end || $end == ($filesize - 1)))) $partial = false; // Invalid range/whole file specified, return whole file } $length = $end - $start + 1; } else $partial = false; // No range requested // Send standard headers header("Content-Type: $contenttype"); header("Content-Length: $filesize"); header('Content-Disposition: attachment; filename="'.$name.'.mp3"'); header('Accept-Ranges: bytes'); // if requested, send extra headers and part of file... if ($partial) { header('HTTP/1.1 206 Partial Content'); header("Content-Range: bytes $start-$end/$filesize"); if (!$fp = fopen($file, 'r')) { // Error out if we can't read the file error_log('can\'t read the file'); header("HTTP/1.1 500 Internal Server Error"); exit; } if ($start) fseek($fp,$start); while ($length) { // Read in blocks of 8KB so we don't chew up memory on the server $read = ($length &gt; 8192) ? 8192 : $length; $length -= $read; print(fread($fp,$read)); } fclose($fp); } else readfile($file); // ...otherwise just send the whole file // Exit here to avoid accidentally sending extra content on the end of the file exit; } </code></pre> <p>HTML:</p> <pre><code>&lt;audio src="/media/play/12345" loop /&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload