2009-09-01 57 views

回答

4

我的猜測是,它在$_SERVER['CONTENT_LENGTH']

如果您需要錯誤檢測,請查看$_FILES['filename']['error']

+0

我正在上傳服務器上的大文件以及其他字段。但是如果我中止它的一部分請求將會丟失,所以我需要將請求主體的實際大小與來自Content-Length頭部的值進行比較,以確保文件上傳不會中止。 –

+0

'$ _SERVER ['CONTENT_LENGTH']'當然包含頭部的值。我認爲確保PHP符合收到的實際數據是PHP的責任。也許'$ _FILES ['file'] ['error']'有一些提示嗎? –

+0

如果您嘗試檢測失敗的文件上傳,您應該按照它在我的文章中顯示的方式進行操作,而不是計算字節數。 –

0

我猜你正在尋找$HTTP_RAW_POST_DATA

+0

嗯......但是你不需要數據就可以知道它的大小,是嗎? –

+0

謝謝,但$ HTTP_RAW_POST_DATA不適用於enctype =「multipart/form-data」。我需要使用multipart/form-data來發送文件。 –

+0

**警告**此功能在PHP 5.6.0中已被棄用,並且自PHP 7.0.0起已刪除。 [PHP的鏈接](http://php.net/manual/en/reserved.variables.httprawpostdata.php) –

4

如果你想找出一個文件上傳是否沒有失敗,你應該使用PHP文件錯誤處理在下面的鏈接中。這是爲了檢測文件上傳錯誤最可靠的方法:
http://us3.php.net/manual/en/features.file-upload.errors.php

如果你需要一個POST請求沒有任何文件上傳大小,你應該能夠像這樣這樣做:

$request = http_build_query($_POST); 
$size = strlen($request); 
+0

否則,如果他'只是'想要的大小,你可以通過使用$ _FILES數組= => $ _FILES ['nameoffile'] ['size'] – Jakub

2

這可能會實現:

$bytesInPostRequestBody = strlen(file_get_contents('php://input')); 
// This does not count the bytes of the request's headers on its body. 
+0

在PHP5.6之前,此操作可能會清除流,導致它只允許讀取一次:[docs](http://php.net/manual/en/wrappers .php.php)。所以你會看到它的長度,但它會是空的 – vladkras

30

簡單:

$size = (int) $_SERVER['CONTENT_LENGTH']; 

請注意,$ _SERVER ['CONTENT_LENGTH']僅通過POST方法在HTTP請求中設置。這是Content-Length標題的原始值。請參閱:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13

在文件上傳的情況下,如果你想上傳的文件的總規模,你應該遍歷$ _FILE元素,總結每個$文件[「大小」]。由於POST數據的編碼開銷,確切的總大小與原始Content-Length值不匹配。

另請注意,文件錯誤,你應該檢查$文件[「錯誤」]每個$ _FILES元素的代碼。例如,部分上傳將返回錯誤UPLOAD_ERR_PARTIAL,並且空的上傳將返回UPLOAD_ERR_NO_FILE。請參閱PHP手冊中的文件上傳錯誤文檔。

+1

$ size =(int)$ _SERVER ['CONTENT_LENGTH'];這是否以字節爲單位給出大小? – anujeet

+0

已棄用... $ _SERVER ['argv'] – ina