2011-10-21 87 views
31

我有一個問題,我有一個HTML表單,上傳一個文件的額外信息。但它允許上傳只有不到10MB的文件。但是,當用戶試圖上傳更大的東西時,$ _POST和$ _FILES數組都是空的(我預計$ _POST會有一些值,$ _FILES會有一些值,但會表明存在上傳錯誤)。

有幾個問題(空的$ _POST,$ _FILES)就是這樣,但我沒有找到任何解決方案或解釋。

HTML表單:

<form enctype="multipart/form-data" method="post" action="upload.php"> 
    <p> 
     <input type="hidden" name="MAX_FILE_SIZE" value="10000000" /> 
     <input type="file" name="image" /> 
    </p> 
    <p> 
     <input type="text" name="other_field" /> 
    </p> 
</form> 

upload.php的

print_r($_POST); // array() 
print_r($_FILES); // array() 
exit; 

它工作正常,如果文件大小小於10MB(文件大小限制爲10MB),我不希望增加它,我只想在PHP中捕獲錯誤。

從PHP網站

從PHP網站更新(說明/解決方案)(我錯過了這部分):允許 http://us.php.net/manual/en/ini.core.php#ini.post-max-size

集後數據的最大尺寸。該設置也會影響文件上傳。要上傳大文件,該值必須大於upload_max_filesize。如果配置腳本啓用了內存限制,memory_limit也會影響文件上傳。一般來說,memory_limit應該大於post_max_size。當使用整數時,該值以字節爲單位進行測量。如本FAQ中所述,速記符號也可以使用。如果發佈數據的大小大於post_max_size,則$ _POST和$ _FILES超全局變量是空的。這可以通過各種方式進行跟蹤,例如,通過將$ _GET變量傳遞給處理數據的腳本,即,然後檢查是否設置了$ _GET ['processed']。

+1

你讀過HTTP:/ /php.net/manual/en/features.file-upload.php? –

+2

是的,但也許我錯過了那裏的東西。在這種情況下,$ _FILES和$ _POST數組都是空的,看起來他們應該給你一個錯誤代碼。 –

回答

28

正如編輯的問題所述,當PHP默默丟棄數據(發生在實際數據大於post_max_size時)時,$ _POST和$ _FILES是空的。由於HTTP頭和$ _GET保持不變,可用於檢測丟棄。

選項a)

if(intval($_SERVER['CONTENT_LENGTH'])>0 && count($_POST)===0){ 
    throw new Exception('PHP discarded POST data because of request exceeding post_max_size.'); 
} 

選項B)
添加告訴POST數據是否存在一個GET參數。

+0

+1「throw exception」 – evilReiko

+1

注意:$ _SERVER ['CONTENT_LENGTH']不是「始終」設置的,服務器主機可以禁止該變量顯示爲 – evilReiko

+1

謝謝,這就是答案! – brentonstrine

0

有一些限制 - 無論是在客戶端還是服務器端。

在客戶端,MAX_FILE_SIZE字段用處不大,也許瀏覽器可能會將其作爲提示;而是瀏覽器遵循其配置的限制。

在服務器端,檢查的php.ini:

upload_max_filesize = 5M 

post_max_size = 5M 

max_input_time = ... 

還檢查Apache的日誌約下降POST團體或筆記。

+0

是的,我知道有限制,但不應該在達到這些限制時給出錯誤? –

+0

http://php.net/manual/en/features.file-upload.errors.php – Crontab

11

運行phpinfo()並檢查以確保您的upload_max_filesizepost_max_size指令足夠大。

http://us.php.net/manual/en/ini.core.php#ini.upload-max-filesize

http://us.php.net/manual/en/ini.core.php#ini.post-max-size

+1

這並沒有解決爲什麼'$ _POST'是空的問題。如果文件大小有錯誤,您會希望得到一條錯誤消息,而不是一個空的'$ _POST'。 – brentonstrine

+0

@brentonstrine您是否認真**從2011年10月份起 - 大約三年前的一篇博文中抱怨一個答案和downvote? OP正在嘗試發送大於「post_max_size」的文件。這反過來(讀取OP)使'$ _POST'和'$ _FILES'爲空。 – Crontab

+3

意圖是不抱怨 - 雖然我看到它是如何通過這種方式。你的答案被認爲比Augustus的答案要高,這個答案比你的答案要詳細得多,才能真正解釋問題所在,甚至提供了一個解決方案來檢測'$ _POST'是否爲空,因爲它超過了最大值。我贊成他的和低調的你的答案,以便他的答案是第一位的,因爲它更有用。評論僅僅是對downvote的解釋。儘管如此,我仍然堅信:關鍵信息是*爲什麼*'$ _POST'是空的。 – brentonstrine

-1

您可以檢查上傳錯誤有:

if ($_FILES['images']['error'] !== UPLOAD_ERR_OK) { 
    die("Upload failed with error code " . $_FILES['images']['error']); 
} 

錯誤代碼定義here

+2

他說'$ _FILES'是空的。無法檢查什麼不存在。 – mpen

1

我可以提,如果你處理的形式像下面

if(isset($_POST['submit']) 

如果post_max_size要高於公佈的數據低則$ _ POST [「提交」]將是空

相關問題