[英]Php file download corrupting audio files
我一直在用php编程文件下载器,以从我的网站下载一些音频文件(.mid,.wav,.mp3)。 下载似乎工作正常,但是当我尝试播放下载的文件时,Windows Media Player说:
Windows Media Player无法播放文件。 播放器可能不支持文件类型,或者可能不支持用于压缩文件的编解码器。
我使用文本编辑软件查看了文件,并注意到“损坏的”文件都有一个额外的换行符,并且在文件的开头都带有“ </ datalist>”:
普通文件
RIFF†WAVEfmtD¬±data @SÿSÿkÿkÿuo÷½[+eŸ0a/ô> T =êFE] JjHLJ¶P—NÊU…S‡[Y _b \\'^×[èZ“XïS3Q
损坏的文件:
</ datalist> RIFF†WAVEfmtD¬±data @SÿSÿkÿkÿuo÷½[+eŸ0a/ô> T =êFE] JjHLJ¶P—NÊU…S‡[Y _b \\'^×[èZ“XïS3Q
当我删除换行符和“ </ datalist>”标签时,音频文件再次工作。 这是我的文件下载脚本:
$eyr = html_entity_decode($_GET['fileUrOpening']);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=".$eyr);
header('Pragma: public');
readfile($eyr);
它是从另一个脚本调用的:
$result = queryMysql("SELECT * FROM fichierschants WHERE chant = '$id';");
$files = $result->num_rows;
if ($files == 0) {
echo '<td> There are no files for this song</td>';
}else{
echo '<td>';
for ($i = 0 ; $i < $files ; ++$i){
$result->data_seek($i);
$eode = $result->fetch_assoc()['emplacement'];
echo'<a href="./readingFile.php?fileUrOpening=';
echo $eode;
echo '"">';
$result->data_seek($i);
echo $result->fetch_assoc()['emplacement']."</a> <br>";
}
echo'</td>';
}
我尝试了许多不同的建议方法来下载文件,但是似乎都无法正常工作。
任何帮助将不胜感激,
亚历克斯。
application/octet-stream
在RFC 2046中定义为“任意二进制数据”。也许尝试为音频文件使用正确的标头? 您可以获取文件mime信息来确定是否应使用Content-Type: audio/mpeg
,或.wav
或.mid
的等效项。
另外,如果脚本是从其他地方调用的,请确保没有输出回显。 我猜没有,或者您将无法正确发送标头,但是值得检查error_log
。 数据列表是一个HTML标记,因此在我看来,该标记来自您脚本的较早版本,可能是缓冲的输出或其他内容。 无论如何,希望这会有所帮助。
我终于发现清理输出缓冲区:
while (ob_get_level()) { ob_end_clean(); }
在调用readfile()之前,避免了文件损坏!
谢谢您的所有建议,我也将它们添加到了脚本中。
祝你今天愉快,
亚历克斯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.