is_uploaded_file
生活随笔
收集整理的這篇文章主要介紹了
is_uploaded_file
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一,表單
???? 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']檢驗好些。
六,檢驗順序
???? 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){//確實是文件
???????????????????????? if(......){//自定義文件大小檢驗邏輯
???????????????????????????? if(......){//自定義文件類型檢驗邏輯
???????????????????????????????? if(move_uploaded_file($_FILES['userfile']['tmp_name'],...))//移動文件
???????????????????????????????????? //..........
???????????????????????????????? }
???????????????????????????????? else
???????????????????????????????????? give_a_message(...);
???????????????????????????? }
???????????????????????????? else
???????????????????????????????? give_a_message(...);
???????????????????????? }
???????????????????????? else
???????????????????????????? give_a_message(...);
???????????????????? }
???????????????????? else
???????????????????????? give_a_message(...);
???????????????? }
???????????????? else
???????????????????? give_a_message(...);
???????????? }
???????????? else
???????????????? give_a_message(...);
???????? }
???????? else
???????????? give_a_message(...);
???? }
???? 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']檢驗好些。
六,檢驗順序
???? 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){//確實是文件
???????????????????????? if(......){//自定義文件大小檢驗邏輯
???????????????????????????? if(......){//自定義文件類型檢驗邏輯
???????????????????????????????? if(move_uploaded_file($_FILES['userfile']['tmp_name'],...))//移動文件
???????????????????????????????????? //..........
???????????????????????????????? }
???????????????????????????????? else
???????????????????????????????????? give_a_message(...);
???????????????????????????? }
???????????????????????????? else
???????????????????????????????? give_a_message(...);
???????????????????????? }
???????????????????????? else
???????????????????????????? give_a_message(...);
???????????????????? }
???????????????????? else
???????????????????????? give_a_message(...);
???????????????? }
???????????????? else
???????????????????? give_a_message(...);
???????????? }
???????????? else
???????????????? give_a_message(...);
???????? }
???????? else
???????????? give_a_message(...);
???? }
轉載于:https://www.cnblogs.com/vicenteforever/articles/1504589.html
總結
以上是生活随笔為你收集整理的is_uploaded_file的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从源代码安装软件
- 下一篇: GridView分页(第一页、上一页、下