2012-04-24 108 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); 

這樣做我能救我的音頻文件在服務器上正確。