2014-01-27 90 views
0

我想要在我的Laravel 4項目中獲得分塊上載在窗體上工作。客戶端位工作到目前爲止,上傳以2MB塊爲單位,數據正在從瀏覽器發送。甚至還有一個方便的進度條來顯示上傳進度。PHP輸入流返回0數據 - Laravel

問題出在PHP端,因爲我無法將上傳流的內容寫入磁盤。系統總是以創建的0字節文件結束。這個想法是在他們到達時將塊添加到已經上傳的文件中。

該項目建立在Laravel 4上,所以我不確定Laravel是否讀取了流並執行了一些操作。由於php://輸入只能被讀取一次,這可能意味着當我的控制器實際嘗試讀取它的流時,它將是空的。

控制器如下所示:正在創建

public function upload() 
{ 
    $filename = Config::get('tms.upload_path') . Input::file('file')->getClientOriginalName(); 
    file_put_contents($filename, fopen('php://input', 'r'), FILE_APPEND); 
} 

的文件,但它的長度始終保持爲0字節。任何想法如何我可以哄騙流出系統的內容:php://輸入

回答

1

據我所知的fopen返回一個指向文件,而不是流,所以可能並不好,作爲file_put_contents

你可以嘗試這種解決方法的參數,而不是你的file_put_contents?

$putdata = fopen("php://input", "r"); 

$fp = fopen($filename, "a"); 

while ($data = fread($putdata, 1024)) 
    fwrite($fp, $data); 

fclose($fp); 
fclose($putdata); 
+0

無論我嘗試什麼,示例中的$ putdata總是包含'' –

+0

,但在我的示例中,putdata是指向文件的指針,而不是字符串。這就是爲什麼我使用while循環。如果你想擁有輸入內容,可以使用'$ string = file_get_contents(「php:// input」);'或者如果你在我的例子中這樣做,並且你想檢查內容而不是寫入它該文件使用'while($ data = fread($ putdata,1024)){$ string。= $ data; fwrite($ fp,$ data); }' –

+0

感謝卡洛斯。 $ content = file_get_contents(「php:// input」);是我嘗試過的,但它返回「」。我甚至嘗試了這個鏈接的建議:http://www.codingswag.com/2013/07/get-raw-post-data-in-laravel/但它不起作用。 –

0

這個問題的答案很簡單,我需要關閉的multipart/form-data的,並使用file_get_contents("php://input")閱讀其內容,並將結果傳遞到file_put_contents()像這樣:

file_put_contents($filename, file_get_contents("php://input"), FILE_APPEND); 

這工作和解決了我的問題。