php文件(upload)上傳錯誤代碼

一,表單 

1,上傳文件的表單使用post方式(和get的區別不用說了);還要加上enctype='multipart/form-data'。 
2, 通常要加上隱藏域:<input type=hidden name='MAX_FILE_SIZE' value=dddddd>,位置在 file域前面。value的值是上傳文件的客戶端字節限制。聽說能夠減小文件超標時客戶端的等待時間,不過我沒以爲有什麼區別。 
3, 出於安全考慮,file域是不準賦值的。隨便在file域輸入字符串,而後按submit也不會有反應。必須是第二個字符是冒號的時候(好比空格跟隨冒號 能夠上傳一個長度爲0字節的「文件」),submit才贊成「服務」——不過這個是客戶端的措施,跟MAX_FILE_SIZE同樣很容易繞過去。 

二,文件上傳錯誤代碼 

先抄一段:預約義變量$_FILES數組有5個內容: 
$_FILES['userfile']['name']——客戶端機器文件的原名稱 
$_FILES['userfile']['type']——文件的 MIME 類型 
$_FILES['userfile']['size']——已上傳文件的大小,單位爲字節 
$_FILES['userfile']['tmp_name']——文件被上傳後在服務端儲存的臨時文件名 
$_FILES['userfile']['error']——和該文件上傳相關的錯誤代碼 

其中$_FILES['userfile']['error']的能夠有下列取值和意義: 
0——沒有錯誤發生,文件上傳成功。  
1——上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。  
2——上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。  
3——文件只有部分被上傳。  
4——沒有文件被上傳。  

1~3不用說了。 
「沒有文件被上傳」(4)是指表單的file域沒有內容,是空字符串。 
「文 件上傳成功」(0)不必定真的有文件上傳了。好比你打了個「c:」給file域,就能夠「上傳成功」——錯誤代碼是0,['name']是「c:」, ['type']是「application/octet-stream」,['size']是0,['tmp_name']是「xxx.tmp」 (xxx是服務器起的名字) 

三,文件大小限制和檢驗 

限制上傳文件大小的因素有 
1,客戶端的隱藏域MAX_FILE_SIZE的數值(能夠被繞開)。 
2,服務器端的upload_max_filesize,post_max_size和memory_limit。這幾項不可以用腳原本設置。 
3,自定義文件大小限制邏輯。即便服務器的限制是能本身決定,也會有須要個別考慮的狀況。因此這個限制方式常常是必要的。 

我 遇見的一種狀況可能不是廣泛性的,說明一下。若是文件比服務器端限制(upload_max_filesize)大不少,但也還沒達到或接近 post_max_size或者memory_limit,$_FILES就會「崩潰」——結果是$_FILES['userfile']變成了 「Undefined index」,固然是什麼檢驗也作不到了。 

服務器端限制的檢驗優先於客戶端限制的檢驗。就是說,若是 兩個限制是同樣的,而文件過大了,$_FILES['userfile']['error']會出錯誤代碼1。只有客戶端限制比服務器端限制小到必定「程 度」,並且文件大小超過二者的時候,纔會出現錯誤代碼2(難道這跟我感受MAX_FILE_SIZE沒起到預想的做用是一個緣由?)。上述的「程度」,在 個人機器上試驗在3~4K之間——個人機器設置的服務器端限制爲2M……由於沒什麼意味,就沒有追求精確的規律。 

出現錯誤代碼1或2的時候: 
$_FILES['userfile']['name']爲客戶端機器文件的原名稱 
$_FILES['userfile']['type']爲空字符串 
$_FILES['userfile']['size']爲0 
$_FILES['userfile']['tmp_name']爲空字符串 

四,文件路徑檢驗 

回顧一下: 

file域無輸入,錯誤代碼爲4(無文件上傳) 
$_FILES['userfile']['name']爲空字符串 
$_FILES['userfile']['type']爲空字符串 
$_FILES['userfile']['size']爲0 
$_FILES['userfile']['tmp_name']爲空字符串 

file域是非文件路徑的字符串(不考慮客戶端的假「限制」了),錯誤代碼是0(「上傳成功」) 
$_FILES['userfile']['name']爲原字符串 
$_FILES['userfile']['type']爲application/octet-stream 
$_FILES['userfile']['size']爲0 
$_FILES['userfile']['tmp_name']爲一個暫時文件名 



五,is_uploaded_file()的返回值 

手冊上面不很詳細地說,用法是: 
bool is_uploaded_file( string filename) 
實際上 
is_uploaded_file($_FILES['userfile']['name']); 
老是返回FALSE。後來看見別人是用: 
is_uploaded_file($_FILES['userfile']['tmp_name']); 

比較一下: 

file域無輸入——————返回FALSE——error=>4,name=>'',   tmp_name=>'',   type=>'',   size=>0 
file域爲非路徑字符串——返回 TRUE——error=>0,name=>'xxx',tmp_name=>'yyy',type=>'zzz',size=>0 
文件上傳成功——————返回 TRUE——error=>0,name=>'xxx',tmp_name=>'yyy',type=>'zzz',size=>sss 
文件太大————————返回FALSE——error=>1,name=>'xxx',tmp_name=>'',   type=>'',   size=>0 
文件太大————————返回FALSE——error=>2,name=>'xxx',tmp_name=>'',   type=>'',   size=>0 
文件部分上傳——————沒機會試驗 —error=>3 

有點懷疑這個函數是怎麼工做的,仍是以爲用$_FILES['userfile']['size']檢驗好些。 

六,檢驗順序 
php

    if($_FILES['userfile']['error']!=4){//有文件上傳

        if($_FILES['userfile']['error']!=3){//所有上傳了

            if($_FILES['userfile']['error']!=1){//不超過服務器端文件大小限制

                if($_FILES['userfile']['error']!=2){//不超過客戶端文件大小限制

                    if($_FILES['userfile']['size']>0){//確實是文件
相關文章
相關標籤/搜索