I\'m working on my school project and I\'m trying to output a mp3 file using PHP but apparently it just outputs some corrupt file and I have no clue why. I browsed the entir
can you try replace
header("Content-Transfer-Encoding: binary");line with
header("Content-Transfer-Encoding: chunked");
Well the answer was way off and it wasn't my script. Before any HTML tag I load all content, if custom headers are defined I only show the content (retrieved from templates)
<?php
//get stuff
if(empty($page->customHeader)): ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php print $page->title ?></title>
</head>
<body>
<div class="container">
<div class="header">
</div>
<div class="content">
<?php print $page->content ?>
</div>
<div class="footer">
</div>
</div>
</body>
</html>
<?php else:
print $page->content;
endif; ?>
For the templates i use ob_get_contents(), so in the actual template I echo/print data. For some reason ob_get_contents() doesn't fetch that properly so that's where it went wrong.
Now I define my headers in an array and the path of the content in another variable and call that.
...
</html>
<?php else:
foreach($page->customHeader as $header) {
header($header, true);
}
readfile($page->headerContent);
endif; ?>
Long story short: ob_get_contents() doesn't get binary content.
Thanks guys, definately going to give you thumbs up for the efford and rather useful information!
header('Content-Disposition: inline;filename="test.mp3"');
That's what you're missing in your header() (you had no "inline" specified). Content-Transfer-Encoding should be "binary", not "chunked".
Edit: use "inline" if you want it to be displayed within the browser (if capabilities exist) or "attachment" if you want to force download.