国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP文件上傳詳解

2024-09-04 11:44:46
字體:
供稿:網(wǎng)友

文件上傳分為兩個部分,HTML顯示部分和PHP處理部分,HTML部分主要是用來讓用戶來選擇所要上傳的文件,然后通過PHP中的$_FILES在后臺接收,然后把文件上傳到指定目錄中.

HTML部分:

實例代碼如下:

  1. <form action="upload.php" method="post" enctype="multipart/form-data"
  2. 上傳:<input type="file" name="myfile" /> 
  3. <input type="submit" name="submit" value="上傳" /> 
  4. </form> 

說明:

form標答的action="upload.php"是指點擊這個form中的submit的時候,這個上傳命令會被發(fā)送到這個叫 upload.php的頁面去處理.method="post"是指以post方式去送,enctype="multipart/form-data"屬性規(guī)定了在提交這個表單時要使用哪種內(nèi)容類型,在表單需要二進制數(shù)據(jù)時,比如文件內(nèi)容,請使用"multipart/form-data",如果要上傳文件,這個屬性是必要的.input中的type="file"時,規(guī)定了應該把輸入作為文件來處理,并且在input后面會有一個瀏覽的按鈕.

PHP部分:

實例代碼如下:

  1. <?php 
  2. if($_FILES['myfile']['name'] != '') { 
  3. if($_FILES['myfile']['error'] > 0) { 
  4. echo "錯誤狀態(tài):" . $_FILES['myfile']['error']; 
  5. else { 
  6. move_uploaded_file($_FILES['myfile']['tmp_name'] , "uploads/" . 
  7. $FILES['myfile']['name']); 
  8. echo "<script>alert(上傳成功!);</script>"
  9. else
  10. echo "<script>alert(請上傳文件!);</script>"
  11. ?> 

說明:

在解釋這篇代碼前,我們有必要了解以下知識.

$_FILES['myfile']['name'] 是指被上傳文件的名稱

$_FILES['myfile']['type'] 是指被上傳文件的類型

$_FILES['myfile']['size'] 是指被上傳文件的大小,單位為字節(jié)(B)

$_FILES['myfile']['tmp_name'] 是指被上傳文件存在服務器中的臨時副本文件名稱,文件被移動到指定目錄后臨文件將被自動消毀.

$_FILES['myfile']["error"] 是指由文件上傳中有可能出現(xiàn)的錯誤的狀態(tài)碼,關(guān)于各狀態(tài)含義后在會說明.

首先,$_FILES['myfile']['name']中的myfile是指在上面HTML頁面中上傳文件標簽的name值,根據(jù)這個我們才能知道我們正在處理的文件是哪一個input提交過來的,然后再來判斷一下 $_FILES['myfile']['name'] 不是否為空,根據(jù)這個我們可以知道用戶有沒有上傳文件,從而執(zhí)行不同的操作.如果上傳了文件并且狀態(tài)是0就說明上傳成功,我們就可以用 move_uploaded_file方法把上傳的文件存放到指定目錄,上面這個例子是指把上傳的文件移動到同目錄下的uploads文件夾下,這個路徑是相對于這個PHP文件(既upload.php)的相對目錄.比如,我們想把上傳的文件移動到upload.php上一層叫user的文件夾中的話,我們就可以這樣寫:move_uploaded_file($_FILES['myfile']['tmp_name'] , "../user/" . $FILES['myfile']['name']),這種方法使用起來很方便、靈活,這樣一個文件就被上傳到服務器中了,可以打開服務器中的目錄查看該文件. 允許用戶上傳文件是一個有巨大的安全風險的行為,因此,通常情況下,我們會對用戶上傳的文件做一些限制,如下:

實例代碼如下:

  1. <?php 
  2. if($_FILES['myfile']['name'] != '') { 
  3. if($_FILES['myfile']['error'] > 0) { 
  4. echo "錯誤狀態(tài):" . $_FILES['myfile']['error']; 
  5. else { 
  6. if($_FILES['myfile']['type'] == 'image/jpeg' or $_FILES['myfile']['type'] == 
  7. 'image/pjpeg' or $_FILES['myfile']['type'] == 'image/gif' && 
  8. $_FILES['myfile']['size'] < 20480){ 
  9. move_uploaded_file($_FILES['myfile']['tmp_name'] , "uploads/" . 
  10. $FILES['myfile']['name']); 
  11. echo "<script>alert(上傳成功!);</script>"
  12. else { 
  13. echo "<script>alert(請上傳小于2MB的jpeg或Gif類型的附件);<script>"
  14. else { 
  15. echo "<script>alert(請上傳文件!);</script>"
  16. ?> 

從上面的代碼可以看出,我們規(guī)定了上傳的文件類型必須是jpeg或者Gif并且必須小于2MB的文件($_FILES['myfile']['size']的默認單位是字節(jié)).這里必須提到的是,對于IE瀏覽器,它識別jpg文件的類型必須是 pjpeg,而對于 FireFox,則必須是 jpeg,因此,我們必須對jpeg和pjpeg都作判斷.這樣一來,我們可以限制用戶上傳的一些危險的比如木馬或者病毒腳本,來保證了服務器的安全運行.現(xiàn)在,一個上傳文件程序就基本成形了.但時在有些時候,考慮到用戶體驗,我們還可以對用戶上傳過程中發(fā)生的錯誤作出一些提醒,讓用戶明白是哪里出了問題,我們會對$_FILES['myfile']['error']作出一些說明,先來看一下在PHP中對$_FILES['myfile']['error']常見6種狀態(tài)的定義.

實例代碼如下:

  1. $_FILES['teacher_pic']['error'] = 1 文件大小超過了PHP.ini中的文件限制 
  2. $_FILES['teacher_pic']['error'] = 2 文件大小超過了瀏覽器限制 
  3. $_FILES['teacher_pic']['error'] = 3 文件部分被上傳 
  4. $_FILES['teacher_pic']['error'] = 4 沒有找到要上傳的文件 
  5. $_FILES['teacher_pic']['error'] = 5 服務器臨時文件夾丟失 
  6. $_FILES['teacher_pic']['error'] = 6 文件寫入到臨時文件夾出錯 

錯誤信息狀態(tài)為1時說明上傳的文件超過了php.ini中的文件大小限制,此限制可以再php.ini中設(shè)置(Maximum allowed size for uploaded files.upload_max_filesize = 2M),這里是在第516行,這一句說定義了PHP中上傳文件的最大字節(jié)數(shù),默認情況下是2MB,這個設(shè)置是PHP全局上傳限制,權(quán)限最高,即使$_FILES['myfile']['size']設(shè)為10MB,也只能上傳2MB以下的文件.比如,在默認情況下,如果規(guī)定$_FILES['myfile']['size'] < 10MB,在用戶上傳文件大于2MB的情況下,就會現(xiàn)在$_FILES['teacher_pic']['error'] = 1的情況,一般來說,我們須要把$_FILES['myfile']['size']的值設(shè)定在upload_max_filesize值之下(設(shè)大了也沒用,呵呵).當然,你完全可以把php.ini中的upload_max_filesize值調(diào)的更大,但實際應用中,我們考慮到服務器的負載能力,不建議upload_max_filesize的值超過20MB,這樣會造成網(wǎng)站附件增大,這在論壇社區(qū)上可以很明顯的看出來.了解了這些,我們就可以對錯誤狀態(tài)作出定義,我們再來完善一下代碼:

實例代碼如下:

  1. <?php 
  2. if($_FILES['myfile']['name'] != ''){ 
  3. if($_FILES['myfile']['error'] > 0){ 
  4. switch($_FILES['myfile']['error']){ 
  5. case 1: 
  6. echo "文件大小超過了PHP.ini中的文件限制!"
  7. break
  8. case 2: 
  9. echo "文件大小超過了瀏覽器限制!"
  10. break
  11. case 3: 
  12. echo "文件部分被上傳!"
  13. break
  14. case 4: 
  15. echo "沒有找到要上傳的文件!"
  16. break
  17. case 5: 
  18. echo "服務器臨時文件夾丟失,請重新上傳!"
  19. break
  20. case 6: 
  21. echo "文件寫入到臨時文件夾出錯!"
  22. break
  23. else { 
  24. if($_FILES['myfile']['type'] == 'image/jpeg' or $_FILES['myfile']['type'] ==  
  25. 'image/pjpeg' or $_FILES['myfile']['type'] == 'image/gif' &&  
  26. $_FILES['myfile']['size'] < 20480) { 
  27. move_uploaded_file($_FILES['myfile']['tmp_name'] , "uploads/" .  
  28. $FILES['myfile']['name']); 
  29. echo "<script>alert(上傳成功!);</script>"
  30. else { 
  31. echo "<script>alert(請上傳小于2MB的jpeg或Gif類型的附件);<script>"
  32. else { 
  33. echo "<script>alert(請上傳文件!);</script>"
  34. ?> 

我們可以使用switch語句來對6種錯狀態(tài)作出定義,這樣來下,在發(fā)生錯誤的時間,用戶就會明白,是哪里出了問題.但是還有一種情況就是,用戶上傳的文件在指定的目錄中已經(jīng)存在,這里我們可以使用file_exists方法來判斷一下:

實例代碼如下:

  1. <?php 
  2. if($_FILES['myfile']['name'] != ''){ 
  3. if($_FILES['myfile']['error'] > 0){ 
  4. switch($_FILES['myfile']['error']){ 
  5. case 1: 
  6. echo "文件大小超過了PHP.ini中的文件限制!"
  7. break
  8. case 2: 
  9. echo "文件大小超過了瀏覽器限制!"
  10. break
  11. case 3: 
  12. echo "文件部分被上傳!"
  13. break
  14. case 4: 
  15. echo "沒有找到要上傳的文件!"
  16. break
  17. case 5: 
  18. echo "服務器臨時文件夾丟失,請重新上傳!"
  19. break
  20. case 6: 
  21. echo "文件寫入到臨時文件夾出錯!"
  22. break
  23. else { 
  24. if($_FILES['myfile']['type'] == 'image/jpeg' or $_FILES['myfile']['type'] ==  
  25. 'image/pjpeg' or $_FILES['myfile']['type'] == 'image/gif' &&  
  26. $_FILES['myfile']['size'] < 20480) { 
  27. if (!file_exists("uploads/" . $_FILES["myfile"]["name"])) { 
  28. move_uploaded_file($_FILES['myfile']['tmp_name'] , "uploads/" .  
  29. $FILES['myfile']['name']); 
  30. echo "<script>alert(上傳成功!);</script>"
  31. else
  32. echo "<script>alert(您上傳的文件已經(jīng)存在!);</script>"
  33. else { 
  34. echo "<script>alert(請上傳小于2MB的jpeg或Gif類型的附件);<script>"
  35. else { 
  36. echo "<script>alert(請上傳文件!);</script>"
  37. ?> 

只是上傳文件最原始的方法,這樣更容易自己理解,使用時大家可以考慮把它寫成類,現(xiàn)在我們再來總結(jié)一下上傳中的邏輯判斷順吧.

1. 先判斷是否上傳文件

2. 如果有再來判斷上傳中是否出錯

3. 如果出錯,則提示出錯信息

4. 如查沒出錯,再判斷文件類型

5. 如果類型符合條件,再判斷指定目錄中有沒有存在該文件

6. 如果沒有就把該文件移至指定目錄

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泸溪县| 罗江县| 镇沅| 鄂托克旗| 巴林右旗| 石河子市| 苏州市| 都兰县| 东乡| 肇源县| 资阳市| 区。| 江永县| 繁峙县| 盐亭县| 江门市| 论坛| 泸州市| 彭山县| 余庆县| 永善县| 科技| 油尖旺区| 巴彦县| 新建县| 姜堰市| 天祝| 永修县| 怀化市| 武功县| 望城县| 齐河县| 宝坻区| 屯留县| 马鞍山市| 炉霍县| 桦南县| 三穗县| 牡丹江市| 南平市| 新野县|