有一个任务:使用 PHP 通过引用保存文件并在 Android 应用程序中提供对它的访问。
下面是保存文件的代码。
function SaveFile($URL, $Path) {
return copy($URL, $Path);
}
假设您想以 MP3 格式保存音乐文件。该函数成功将文件保存到服务器(该文件在服务器上没有扩展名),但是在OS Windows中下载并安装文件扩展名后,无法正常播放。没有音乐,只有一些奇怪的声音。
与图像完全相同 - 源文件实际上无法识别。
顺便说一句,使用 MediaPlayer OS Android 成功播放了相同的音乐文件。
为什么会这样?如何解决这个问题?
替代功能。
private function SaveFile($URL, $Path) {
$ReadFile = fopen ($URL, "rb");
if ($ReadFile) {
$WriteFile = fopen ($Path, "wb");
if ($WriteFile){
while(!feof($ReadFile)) {
fwrite($WriteFile, fread($ReadFile, 4096));
}
fclose($WriteFile);
}
fclose($ReadFile);
}
}
简短的回答
s/0x0d0x0a/0x0a/g。完整的答案。在 Windows 中,有打开一个文本文件和一个二进制文件之类的东西(在 Linux 中没有意义)。底线是,如果文件作为二进制文件打开,那么所有内容都会按预期写入,如果是文本文件,则换行符
\n(0x0A) 将被编码为 0x0D 0x0A。对于图片/音乐,它几乎总是致命的。实际上,这个错误在fopen函数的 php 文档中有所描述。该怎么办?要么将服务器转移到 Linux,要么将字母 b 添加到 fopen 函数(及其相关函数)的第二个参数。
事实证明,PHP 需要一个文件扩展名才能正确写入文件。我不清楚这个要求的原因,但显然指定“?b”并不能保证强制二进制模式。然而,这只是我的猜测——它可能是错误的。
通常,变量
$Path必须具有文件扩展名。