2011-05-24 111 views
8

我想從php使用php://輸入讀取原始輸入流。這適用於大多數文件,但是,在上傳中忽略超過4MB的文件。我已經設置post_max_size和upload_max_size爲20M,每個人都認爲它可以解決我的問題,但事實並非如此。是否有另一個php.ini設置需要配置,或者我需要做某種類型的分塊?如果是這樣,我該怎麼做呢?下面是upload.php的代碼:php輸入流大小限制

$fileName = $_SERVER['HTTP_X_FILE_NAME']; 
$contentLength = $_SERVER['CONTENT_LENGTH']; 

file_put_contents('uploads/' . $fileName, file_get_contents("php://input")); 
+0

僅供參考...我通過xmlhttprequest發送文件,通過send方法傳遞文件對象。 – srowley 2011-05-24 05:21:33

+0

我想通了。 PHP內存不足以將整個文件放入緩衝區,所以我使用php.ini memory_limit變量增加了內存限制。它有效,但它似乎不是最好的解決方案。如果有人知道如何將php://輸入流分段讀入文件,以免耗盡內存限制,請告訴我!謝謝 – srowley 2011-05-24 05:31:26

回答

10

嘗試stream_copy_to_stream,這直接泵輸入到文件的內容而不復制所有到存儲器第一:

$input = fopen('php://input', 'rb'); 
$file = fopen($filename, 'wb'); 
stream_copy_to_stream($input, $file); 
fclose($input); 
fclose($file); 

備選:

$input = fopen('php://input', 'rb'); 
$file = fopen($filename, 'wb'); 
while (!feof($input)) { 
    fwrite($file, fread($input, 102400)); 
} 
fclose($input); 
fclose($file); 
+0

對不起,這不起作用,結果與以前相同。現在我可以上傳大文件的唯一方法是在php.ini文件中將memory_limit設置爲更大的大小。出於某種原因,我甚至不能用ini_set(「memory_limit」,「64M」)修改它; – srowley 2011-05-24 06:03:31

+0

@srowley這很奇怪。我測試了stream /從'/ dev/random'拷貝數百MB的內存,內存使用率從未超過7MB。根據手冊頁上的評論,'stream_copy_to_stream'確實有時似乎行爲不端。發佈「手動」替代。如果這也沒有幫助,你的問題就在別的地方。 – deceze 2011-05-24 06:07:43

+0

我現在真的很困惑..你的第一種方法實際上與672M文件,但不是5M文件。我不知道爲什麼。 – srowley 2011-05-24 06:08:52