【发布时间】:2012-04-24 21:46:19
【问题描述】:
我正在尝试在我的服务器上保存一个音频文件。我在 iPhone 上以 PCM 格式录制音频,并将编码为 Base64 字符串的数据发送。我尝试了 3 种不同的方法来保存文件,所有 3 种方法都创建了一个空的 wav 文件:
尝试 1:
$file = fopen($filePath, 'w');
fwrite($file, base64_decode($this->data['Voicenote']['audio_data']));
fclose($file);
尝试 2:
file_put_contents($filePath, base64_decode($this->data['Voicenote']['audio_data']));
尝试 3:
$audioFile = new File($filePath, true);
$audioFile->write(base64_decode($this->data['Voicenote']['audio_data']));
$audioFile->close();
【问题讨论】:
-
文件有多大?会不会是 PHP 内存不足?您将文件多次加载到内存中:在
$this->data和base64_decode保存的临时返回值中。您真的应该尝试流式传输数据而不是缓冲它。使用多部分文件上传而不是带有表单数据的 POST 也可能是明智的。 -
该文件大约 1MB,我尝试使用 Red5 媒体服务器从该站点流式传输它,但无法正常工作。多部分表单可能有效,但我还必须在加载文件时创建一个数据库条目。你有什么可以推荐的资源吗?
-
如果您只是简单地写入文件并将指向该文件的链接存储在数据库中,那么您不必担心内存需求,只要您使用多部分文件上传即可。您绝对不想使用 base64 进行文件上传,尤其是 PHP,因为这意味着您必须将整个文件加载到服务器的内存中。避免在可能很大的文件(比如 >500KB)上使用像
file_get_contents这样的函数。 PHP 效率极低,一个简单的base64_decode在 1.3MB 的“字符串”上可能会占用 16MB 的内存。 -
我使用 base64 是因为这是我能够将文件适当地上传到服务器的唯一方法,您知道我可以遵循的任何教程吗?
-
ASIHTTPRequest 是目前最流行的 iOS 库之一,它让您轻松完成这项工作。它甚至是(可选的)异步的。