【发布时间】:2018-08-31 09:43:54
【问题描述】:
我一直在用 php 编写一个文件下载器来从我的网站下载一些音频文件(.mid、.wav、.mp3)。下载似乎工作正常,但是当我尝试播放下载的文件时,windows media player 说:
Windows Media Player 无法播放该文件。播放器可能不支持文件类型或可能不支持用于压缩文件的编解码器。
我用文本编辑软件查看了文件,发现“损坏”的文件在文件开头都有一个额外的换行符和“”:
普通文件
RIFF† WAVEfmt D¬ ± 数据@ SÿSÿkÿkÿu o ÷½ [+eŸ0a/ô>T=êFE]JjHLJ¶P—NÊU…S‡[Y _b\'^×[èZ"XïS3Q
损坏的文件:
RIFF† WAVEfmt D¬ ± 数据@ SÿSÿkÿkÿu o÷½ [+eŸ0a/ô>T=êFE]JjHLJ¶P—NÊU…S‡[Y _b\'^×[èZ"XïS3Q
当我删除换行符和“”标签时,音频文件再次工作。 这是我的文件下载脚本:
$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>';
}
我尝试了许多不同的建议方法来下载我的文件,但它们似乎都不能正常工作。
任何帮助将不胜感激,
亚历克斯。
【问题讨论】:
-
这是您下载脚本中的所有代码还是包含更多代码?另外,您是否检查过原始文件不包含该内容?
-
这就是这个脚本的全部内容,它只是从其他脚本中调用并获取要下载的文件名
-
原始文件正常工作,不包含该文件
-
“它只是被其他脚本调用” - 所以这个脚本不是直接从浏览器调用的,在这之前还有更多的代码被执行?请向我们展示从请求开始到您发布的下载脚本的所有代码。您可能还应该使用
urldecode()而不是html_entity_decode()。您还应该对$eyr-变量进行一些验证,以确保人们不会传递其他文件(现在,人们可以请求您服务器上 PHP 具有读取权限的任何文件,以便下载)。 -
我没有看到您在新代码中“调用”该脚本。虽然有一个链接,但 HTML 看起来有点错误。这个
echo '"">';应该只是echo '">';(少一个双引号)。从您显示的代码中,没有任何内容可以将</datalist>添加到文件的开头。一定有什么事情你没有向我们展示。