關聯課件: 6子項目六 - $_FILE數組樹關(點擊在線預覽)
6.3.3 $_FILE筆志數組
&黃匠nbsp; 文件上傳的功能(néng)是經(jīng)常使用的,這(zhè)兵樹就(jiù)需要用到$_FIL費的E數組。有了文件上傳的功能(néng),不僅可以爲網站動态添加附件,以實現大的網頁的文字編輯的功能(néng),而且對國還(hái)可以實現網站中相關圖片、Flash動畫等的動态更新等。下路讀面(miàn)就(jiù)通過(guò)一個實例來了解$_FILE數組的使用窗有方法和文件上傳的基本原理。
1: <!--文件6-鐘通3.php:文件上傳實例--&g會場t;
2: <!--爲了能(n請街éng)正确運行,請在本文件的同目錄爸廠下新建一文件夾,名爲"upfile&q司制uot;,權限設置可寫-->對生;
3: <?php
4: &n笑綠bsp; if ($西裡_POST[add]=="上傳"){
5: &n聽自bsp; &議小nbsp; &nbs就家p; //根據現在的時(shí)間産生一個随機數
6: &nbs在笑p; &nbs能我p; $rand1=rand 行地(0,9);
7: 民光  林相; &n煙短bsp; $rand2=rand (0,9媽你);
8: &nbs能業p;  資店; $rand3=rand (刀計0,9);
9:  校體; &從裡nbsp; $filenam分師e=date ("Ymdhms&qu鄉秒ot;).$rand1.$rand2.$r門到and3;
10:  吃書; &nb車是sp; if(empty ($_FIL黃亮ES['file_name&水空#39;]['name'])){
11:  議你; &n要裡bsp;//$_FILES['file_name'][為拿9;name']爲獲取客戶端機器文件的冷到原名稱
12: &nbs影雪p; &nb校科sp; 年城 echo林道"文件名不能(néng)爲空"讀資;
13: &nb關我sp; &n又著bsp; &nbs喝紅p; &nbs場北p; e請老xit;
14: &nbs子行p; &n嗎票bsp; &nb化店sp;}
15: &nb算答sp; $oldfilename=$_FILES[黑黑'file_name']['name'];見視
16: &n樹亮bsp; echo "<br>原文件銀刀名爲:".$oldfilename;
17:$filetype=substr($old站見filename,strrpos($oldfilename,&quo煙民t;."),strlen($o高暗ldfilename)-strrpos($oldf見筆ilename,".&話費quot;));
18:  動家; echo "<br>原文多兒件的類型爲:".$filetype;
19:if(($filetype!=在就39;.doc')&am子區p;&($filetype!='笑著;.xls')&&a影紙mp;($filetype!='.DOC')&&a志員mp;($filetype!=電月39;.XLS')){
20: &nbs水照p; echo "<sc可近ript>alert('文件類型或地址錯誤')服遠;</script>";
21:  吧樂; &nbs計拍p; echo "<script>loca妹錢tion.href='6-6.p生街hp';</script&科飛gt;";
22: &nbs船那p; &nbs光費p; exit;
23:  窗照;  要子; }
24: 開我 e空行cho "<br>上傳文件的大小爲腦校(字節):".$_FILES['file森麗_name']['size'的好;];
25: 朋用 //$_FI吧多LES['file_name'化鄉;]['size']爲獲取客戶端機器文件的大訊低小,單位爲B
26: &nb體綠sp; if ($_FILES['愛場file_name']['size']&g日爸t;1000000) {
27: &nbs熱信p; 大報echo "<scri身唱pt>alert('文件太大,不能(néng)上傳');家車</script>";
28: 是拍 &司慢nbsp; &nbs報作p; echo "<script>loc讀離ation.href='6-6.ph懂照p';</script>&qu窗做ot;;
29: &nb頻能sp; 分雨 exit;
30: 作問 &n大兵bsp; }
31: &n民煙bsp; echo "<br>文件妹錢上傳服務器後(hòu)的臨時(shí)文件名爲:".$_FIL白鐘ES['file_name']['t國樹mp_
name'];
32: &nb一唱sp; 兵對 //取得保存文件的臨時(shí)土理文件名(含路徑)
33: &nbs水錯p; $filename=$filename.$file愛很type;
34: 的但 echo "<br>新文件名書大爲:".$filename;
35: &nbs理兵p; $sa日短vedir="upfile/".$能城filename;
36: &nb低她sp; if(move_u城議ploaded_file($_FILES['file_name&算車#39;]['tmp_n大小ame'],$savedir)){
37: &白討nbsp; 子農 $f但工ile_name=basename($s照科avedir); //取得保存文件的電件文件名(不含路徑)
38: 樂行 音謝 echo 區來"<br>文件上傳成(chéng)功!保存爲:&好志quot;.$savedir;
39: &nbs短報p; 著得 友做}else{
40: 計道  金我; ech媽為o "<script 朋線language=javascript>&qu河費ot;;
41: &nbs東低p; 線畫 e木什cho "alert('錯誤,雜熱無法將(jiāng)附件寫入服務器! 本次發(白木fā)布失敗!');";
42: 友煙 &n物視bsp; echo "loca新子tion.href='6-6.ph南讀p?';";
43: &nbs市我p; &nbs匠爸p; &n物購bsp; echo "她能;</script>";
44:  為訊; 校通 e機腦xit;
45: &n有訊bsp; }&nbs上火p; 廠習
46: }
47: ?>
48: <h短子tml>
49: <head>
50: <meta 妹草http-equiv="Content-Language&qu懂物ot; content="zh-cn">
51: <meta http-equiv="C現子ontent-Type" content="text長相/html; charset=gb2玩化312">
52: <title>==文件上傳實例聽拿==</title>
53: <style>
54: body{font-size:10p亮算t};
55: td{font短通-size:10pt};
56: .style1 {col業民or: #FF0000}
57: .style2 {
58: &nb妹美sp; color: #000000;
59: font-weight: 司姐bold;
60: }
61: </style>道子;
62: </head&g能制t;
63: <body>
64: <div&g媽通t;
65: </div>
66: <fo公醫rm enctyp可白e="multipart/form-data"花林; action="6-6.php" method=&近有quot;post">農唱
67: <謝高;!--此處一定要有enctype="multipart電線/form-data"//-->
68: 低亮 <table width="486&quo笑要t; height="103"睡好 border="1"行醫; cellpadding= 車喝"0" cells pa制些cing="0" bordercolor="#0就樹08080" id=&q離行uot;AutoNumber1" 冷習style="border-coll做好apse: collapse">
69: &nb新有sp; <tr bgcolor="#文票CCCCCC">
70: 林算<td height="學區30" colspan="2"><著女div>文件上傳實例&l見低t;/div> </td>
71: </t刀冷r>
72: <tr>
73: &商門nbsp; <td width="窗在;103" height="愛火;45"><場刀;div><span>南電*</span>文件上傳地址山熱:</div></td&g友船t;
74:  物音; <td匠音 width="377" height="45&北習quot;><input type="自國file" name="file_name"&著聽gt;
75: &nb務但sp; (大小〈2M 爲宜)</黑地td>
76: </t工新r>
77: <tr雪南>
78: <t資也d height="33&跳男quot; colspan="2">
79: &nbs校坐p; <p><input type兒是="submit" value="上傳&qu你美ot; name="add">
80:  現個;  相國; &事議;nbsp;<input type="re頻腦set" value=&你費quot;重置"name="B2"&術制gt; </td>
81: </tr>
82: </table>
83: </form>
84: </body>
85: </html>
值得注意的是“&畫雪lt;form enctype著還="multipart/form-data"算金;......>”是一個标簽,要離唱實現文件的上傳,必須將(jiāng)其指定爲multipart/信公form-data,否則服務器將(jiān紅高g)不知道(dào)如何執!
程序6-3.php的其運行效果如圖6-6所示。
(a)單擊“上傳”按鈕前
(b)單擊“上傳”按鈕後(hòu)
&n媽大bsp; 需要說(sh坐都uō)明的是,“$_FILES['file_name花答9;]['name']”爲上傳文件的名字;“$_FILES[妹店'file_
name']['size']”老日爲上傳文件的大小,單位爲字節;“$_FILE生到S['file_name多窗39;]['tmp_name']”爲文件上傳到服務器上臨時店制(shí)文件的名字。
年遠 通過(guò)上面(m兒關iàn)的例子,不難發(fā)現文件上傳的基本原理是:客戶機文的劇件→服務器臨時(shí)文件夾→服務器上傳文件夾。文件上傳過有不(guò)程中從客戶機到服務器的上傳過(guò)程中要通過(guò房裡)一系列的驗證,如文件的類型、大小等是否符合要求,從服務器臨時(shí)文件通看夾到服務器上傳文件夾的複制轉移過(guò)程中要給對答文件重新命名等。
上面(m說拿iàn)測試了上傳一個文件的例子,要上傳多個文件應當如何處理呢?PH資一P 支持同時(shí)上傳多個文件厭街并將(jiāng)它們的信息自動著讀以數組的形式進(jìn)行組織。要完成(chéng)這(z土開hè)項功能(néng),需要在HTML表單中對(duì)文件上傳域使議國用與選框和複選框相同的數組式提交語法,可上弟以用下面(miàn)的方法來處理。
&樹看nbsp; 提交的表單可以寫成(輛到chéng):
<form action="朋相;file-upload.php"白個; method="post" enctype=空制"multipart/form-data"&g們購t;
Send these files:<br>
<input答大 name="userfile討算[]" type="file&q那匠uot;><br>
<input name="日畫userfile[]"訊行; type="file"><br>
<input type="s線民ubmit" value="來動Send files">
</form>
動校當以上表單被(bèi)提交後(hò子火u),數組$_FILES['userfile'森愛;]、$_FILES['user請化file']['name']和$_FILES[文了'userfile']購個['size']將(jiāng)被(bèi很裡)初始化。如果register_還拍globals的設置爲on,則和文件上傳相關的全局變量也將(jiāng)個吃被(bèi)初始化。所有這(zhè)些提交的信息都(dōu不冷)將(jiāng)被(bèi)儲存到以數字爲索引的數這司組中,用戶接收使用即可。
$_FILES數組内容如下: $_FILES[近船'myFile']['name'] 客戶端文件的原名稱。 $_FILE作畫S['myFile']['type'] 文件的 MIME 類型,需要黑農浏覽器提供該信息的支持,例如&quo睡劇t;image/gif"。 $_科飛FILES['myFile']['size店鐘'] 已上傳文件的大小,單位爲字節。 $_FI雨好LES['myFile']['tmp_n物還ame'] 文件被(bèi)上傳器去後(hòu)在服務端儲存的臨時(shí)文件名,一般是系統默認。可以生森在php.ini的upload_tmp_朋音dir 指定,但用 putenv() 函數設置是不起(qǐ)作用的。 生業$_FILES['myFile']['error'] 和該文件飛麗上傳相關的錯誤代碼。
這(zhè)個如何判斷我提交的文件或者照片是不是正匠可确的格式呢?
有了文件上傳的功能(néng),不僅可以爲網站動态添加附件,以個女實現網頁的文字編輯的功能(néng),而且還(hái)可以實森市現網站中相關圖片、Flash動畫等的動态更新等
講得不錯,,,