2012-04-24 112 views
0

我试图将音频文件保存在我的服务器上。我以PCM格式将音频录制在iPhone上,并发送编码为Base64字符串的数据。我已经试过3种不同的方法来保存文件,所有3创建一个空的wav文件:PHP - 将音频数据写入文件结果为空文件

尝试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(); 
+1

该文件有多大?难道是PHP只是内存不足?您将文件加载到内存中多次:在'$ this-> data'和'base64_decode'所保存的临时返回值中。你应该真的尝试流数据而不是缓冲它。使用多部分文件上传而不是带有表单数据的POST也许是明智的。 – 2012-04-24 21:49:22

+0

该文件大约1MB,我试图使用Red5媒体服务器从网站流式传输,无法使其工作。多部分表单可能工作,但我也必须在加载文件时创建一个数据库条目。你可以建议任何资源? – 8vius 2012-04-24 21:56:21

+0

如果您只是写入文件并在数据库中存储指向该文件的链接,则只要您使用多部分文件上传,就不必担心内存要求。你绝对不希望使用base64进行文件上传,特别是不使用PHP,因为这意味着你必须将整个文件加载到服务器的内存中。避免在可能很大的文件上使用像'file_get_contents'这样的函数(假设大于500KB)。 PHP的效率非常低,一个简单的'base64_decode'在1.3MB的“字符串”上可以占用16MB的内存。 – 2012-04-24 22:01:31

回答

0

我设法解决这个问题,下面的代码在this question

而在我的PHP代码我做了以下内容:

move_uploaded_file($_FILES['audio_file']['tmp_name'], $filePath); 

这样做我能救我的音频文件在服务器上正确。