2013-05-18 29 views
8

所以我希望用戶能夠上傳大文件而不必擔心後期最大大小值。 另一種方法是使用PUT並將文件作爲原始數據發送。由於把整個文件到一個變量形式邊界和編寫php://輸入到php中的文件

$client_data = file_get_contents("php://input"); 

: 當使用jQuery我可以這樣做:

var data = new FormData(); 
    jQuery.each($('#file_upload')[0].files, function(i, file) { 
    data.append('file-'+i, file); 
}); 
$.ajax({ 
    url: 'upload.php?filename=test.pdf', 
    data: data, 
    cache: false, 
    contentType: false, 
    processData: false, 
    type: 'PUT', 
}); 

在PHP中我可以這樣做:

$f = fopen($_GET['filename'], "w"); 
$s = fopen("php://input", "r"); 

while($kb = fread($s, 1024)) 
{ 
    fwrite($f, $kb, 1024); 
} 
fclose($f); 
fclose($s); 
Header("HTTP/1.1 201 Created"); 

我沒有做上傳大文件時肯定會填滿所有內存。

我無法弄清楚的是如何在沒有窗體邊界的情況下編寫文件數據。 現在它寫在文件是這樣的頂部:

------WebKitFormBoundaryVz0ZGHLGxBOCUVQG 
Content-Disposition: form-data; name="file-0"; filename="somename.pdf" 
Content-Type: application/pdf 

,並在底部是這樣的:

------WebKitFormBoundaryVz0ZGHLGxBOCUVQG--  

所以我需要解析的數據。但爲此,我需要將整個數據流讀入內存,並且我不想那麼做。 我沒有讀過關於創建一個php:// temp流的信息。但沒有運氣,但與此。 如何在沒有邊界頭的情況下將內容寫入文件?沒有首先將所有數據抽入變量?

+0

你能否提供'Content-Type'頭文件? –

回答

1

可能的fgets組合停止閱讀在換行和檢查的界限:

while($kb = fgets($s, 1024)) 
{ 
    if(strpos($kb, '------') === false) //or !== 0 for first position 
    { 
     fwrite($f, $kb, 1024); 
    } 
} 
+0

但是如何確定'-----'是否包含在同一塊中?如果「---」包含在第一個塊的末尾和「---」中,那麼該怎麼辦?這是第二個塊的開始?或者它不可能是這種情況? – Tamara

+0

'fgets'讀到行'\ n'的末尾,所以 - 會在下一行的開頭。 – AbraCadaver

+0

如果是這樣的話,下面的頭文件會發生什麼?他們也會損壞文件。 –

1

您可以使用this(有很多喜歡它)。它支持分塊上傳,這意味着只要每個上傳塊小於文章最大大小,就不會達到任何文章/文件的最大大小。

它還包括您需要在服務器端的PHP code

+0

我在幾個有很多上傳文件的網站上使用blueimp上傳器,它對我的​​用戶來說效果很好。 –

0

沒有必要重新創建輪子。只需使用POST並將PHP的配置更改爲更大的限制即可。這些限制也可以在每個目錄/主機的基礎上進行設置。

使用的.htaccess或您的apache.conf

php_value upload_max_filesize 10G 
php_value post_max_size 10G 

這也是一個好主意,調整其他限制,如max_input_time設置。

不要忘記使用move_uploaded_file重新定位收到的文件,以避免任何額外的工作。