php文件上傳 你真的掌握了嗎
這里首先聲明一下這一章的內(nèi)容比較多,比較難,你要抱著和自己死磕的態(tài)度。細(xì)微之處不放過(guò),多敲多練是王道。
學(xué)習(xí)就像爬山,得一步一步來(lái),首先給自己定一個(gè)小目標(biāo),然后再堅(jiān)持不懈地往高出攀爬,最終到達(dá)最頂峰。
請(qǐng)仔細(xì)斟酌上面兩句忠告
一、我的準(zhǔn)備情況說(shuō)明。
編輯器:sublime text3(用什么編輯器看自己愛(ài)好)
服務(wù)器構(gòu)建:使用phpstudy2014構(gòu)建服務(wù)器,服務(wù)器文件存儲(chǔ)在我自身電腦D盤(pán)的www文件中。(安裝phpstudy會(huì)自動(dòng)生成www文件,安裝在哪個(gè)盤(pán)自己做主)。運(yùn)行phpstudy,通過(guò)在瀏覽器地址欄輸入localhost可以訪(fǎng)問(wèn)服務(wù)器中文件。
上傳文件的過(guò)程:瀏覽器在客戶(hù)端上傳文件,點(diǎn)擊提交,文件被傳送給服務(wù)器中的某個(gè)php文件進(jìn)行處理,該php對(duì)該上傳文件保存到服務(wù)器。
二、創(chuàng)建表單
請(qǐng)看我的html代碼

enctype
在Form元素的語(yǔ)法中,EncType表明提交數(shù)據(jù)的格式 用 Enctype 屬性指定將數(shù)據(jù)回發(fā)到服務(wù)器時(shí)瀏覽器使用的編碼類(lèi)型。enctype有三種:
1、application/x-www-form-urlencoded: 窗體數(shù)據(jù)被編碼為名稱(chēng)/值對(duì)。這是標(biāo)準(zhǔn)的編碼格式。
2、multipart/form-data: 窗體數(shù)據(jù)被編碼為一條消息,頁(yè)上的每個(gè)控件對(duì)應(yīng)消息中的一個(gè)部分。
3、 text/plain: 窗體數(shù)據(jù)以純文本形式進(jìn)行編碼,其中不含任何控件或格式字符。
補(bǔ)充(隨便看看就好):orm的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認(rèn)為application/x-www-form-urlencoded。 當(dāng)action為get時(shí)候,瀏覽器用x-www-form-urlencoded的編碼方式把form數(shù)據(jù)轉(zhuǎn)換成一個(gè)字串(name1=value1&name2=value2…),然后把這個(gè)字串a(chǎn)ppend到url后面,用?分割,加載這個(gè)新的url。 當(dāng)action為post時(shí)候,瀏覽器把form數(shù)據(jù)封裝到http body中,然后發(fā)送到server。 如果沒(méi)有type=file的控件,用默認(rèn)的application/x-www-form-urlencoded就可以了。 但是如果有type=file的話(huà),就要用到multipart/form-data了。瀏覽器會(huì)把整個(gè)表單以控件為單位分割,并為每個(gè)部分加上Content-Disposition(form-data或者file),Content-Type(默認(rèn)為text/plain),name(控件name)等信息,并加上分割符(boundary)。
有點(diǎn)難理解。
總歸就記住兩句話(huà):如果input標(biāo)簽中有type=file,則enctype=multipart/form-data。如果沒(méi)有type=file一般情況下使用application/x-www-form-urlencoded。
文件上傳時(shí)都要將數(shù)據(jù)進(jìn)行一定轉(zhuǎn)化才能上傳到服務(wù)器,application/x-www-form-urlencoded和multipart/form-data兩者之間的區(qū)別就在與轉(zhuǎn)化編碼方式不同。
三、創(chuàng)建php文件用于處理上傳的文件。

上傳文件后效果如下:

每一個(gè)上傳文件都有name、type、size、tmp_name等信息。文件上傳后,這些文件相關(guān)信息存在FILES這個(gè)數(shù)組變量。_FILES[“myfile”][“name”]相當(dāng)于一個(gè)多維數(shù)組的訪(fǎng)問(wèn),F(xiàn)ILES先獲取表單名稱(chēng)為myfile的input上傳的文件數(shù)據(jù),然后再訪(fǎng)問(wèn)name、type、size、error等數(shù)據(jù)。_FILES["myfile"]["error"]用來(lái)處理文件沒(méi)有正常上傳的情況,例如超過(guò)限定上傳的文件大小。如果FILES[“myfile”][“error”]=0,表示文件正常上傳。_FILES[“myfile”][“error”]>0表示文件沒(méi)有正常上傳。
FILES[“myfile”][“error”]=1上傳文件超過(guò)服務(wù)器限定的值,比如超過(guò)服務(wù)器空間大小。_FILES[“myfile”][“error”]=2 超過(guò)瀏覽器限定上傳的值 $_FILES[“myfile”][“error”]=3文件只有部分被上傳
FILES[“myfile”][“error”]=4沒(méi)有文件本上傳。_FILES[“myfile”][“error”]還可以為5、6、7、8,這里不做深究,只需知道其大于0時(shí)就意味這文件上傳出錯(cuò)即可。
上傳限制
通常情況下,服務(wù)器通常會(huì)限制服務(wù)器上傳文件的大小或者類(lèi)型。我們?cè)谏厦鎝hp代碼的基礎(chǔ)上添加對(duì)上傳文件代碼的限制。
先熟悉幾個(gè)函數(shù)用法:
explode()函數(shù)用于分割字符串,例:explode(“.”,”aaa.HTML”)就是在點(diǎn)的位置將這個(gè)字符串分成”aaa”和”HTML”兩個(gè)字符串,這兩個(gè)字符串按順序存儲(chǔ)在同一個(gè)數(shù)組中。
end()獲取數(shù)組中最后一個(gè)元素的值。
in_array()在數(shù)組中查找某個(gè)元素,看是否存在,存在返回為true,不存在返回為false。
<?php
//第一步:明確服務(wù)器規(guī)定上傳至服務(wù)器的文件類(lèi)型。這里我們只允許上傳以下類(lèi)型的圖片。
$allowedExts = array("gif", "jpeg", "jpg", "png");// 允許上傳的圖片后綴
//第二部:獲取上傳的文件名稱(chēng),通過(guò)explorde()函數(shù)將其分割成字符串形式的數(shù)組。
$temp = explode(".", $_FILES["myfile"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp); // end函數(shù)用于獲取數(shù)組中最后一個(gè)元素的值。
//第三步:列出上傳文件需要滿(mǎn)足的條件
if ((($_FILES["myfile"]["type"] == "image/gif")
|| ($_FILES["myfile"]["type"] == "image/jpeg")
|| ($_FILES[myfile"]["type"] == "image/jpg")
|| ($_FILES["myfile"]["type"] == "image/pjpeg")
|| ($_FILES["myfile"]["type"] == "image/x-png")
|| ($_FILES["myfile"]["type"] == "image/png"))
&& ($_FILES["myfile"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
//in_array表示在$allowedExts數(shù)組中查找$extension這個(gè)字符串
{
if ($_FILES["myfile"]["error"] > 0)
{
echo "錯(cuò)誤:: " . $_FILES["myfile"]["error"] . "<br>";
//舉個(gè)例子服務(wù)器空間不足,文件只能上傳部分就會(huì)出現(xiàn)錯(cuò)誤。
}
else
{
echo "上傳文件名: " . $_FILES["myfile"]["name"] . "<br>";
echo "文件類(lèi)型: " . $_FILES["myfile"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["myfile"]["size"] / 1024) . " kB<br>";
echo "文件臨時(shí)存儲(chǔ)的位置: " . $_FILES["myfile"]["tmp_name"] . "<br>";
}
}
else
{
echo "非法的文件格式";
}
?>
四、保存上傳的文件
文件上傳后,它是保存在一個(gè)臨時(shí)的位置。腳本結(jié)束時(shí)它就會(huì)消失。如果要把他永久的保存在服務(wù)器中,我們要把它保存在另一個(gè)位置。
. file_exists(“upload/” . FILES[“file”][“name”])檢查文件或目錄是否存在。.moveuploadedfile(_FILES["file"]["tmp_name"], "upload/" . $_FILES[“myfile”][“name”]);將上傳文件從臨時(shí)位置轉(zhuǎn)移到服務(wù)器空間。
<?php
//第一步:明確服務(wù)器規(guī)定上傳至服務(wù)器的文件類(lèi)型。這里我們只允許上傳以下類(lèi)型的圖片。
$allowedExts = array("gif", "jpeg", "jpg", "png");// 允許上傳的圖片后綴
//第二部:獲取上傳的文件名稱(chēng),通過(guò)explorde()函數(shù)將其分割成字符串形式的數(shù)組。
$temp = explode(".", $_FILES["myfile"]["name"]);
echo $_FILES["myfilefile"]["size"];
$extension = end($temp); // end函數(shù)用于獲取數(shù)組中最后一個(gè)元素的值。
//第三步:列出上傳文件需要滿(mǎn)足的
if ((($_FILES["myfile"]["type"] == "image/gif")
|| ($_FILES["myfile"]["type"] == "image/jpeg")
|| ($_FILES["myfile"]["type"] == "image/jpg")
|| ($_FILES["myfile"]["type"] == "image/pjpeg")
|| ($_FILES["myfile"]["type"] == "image/x-png")
|| ($_FILES["myfile"]["type"] == "image/png"))
&& ($_FILES["myfile"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))//in_array表示在$allowedExts數(shù)組中查找$extension這個(gè)字符串
{
if ($_FILES["myfilefile"]["error"] > 0)
{
echo "錯(cuò)誤:: " . $_FILES["myfile"]["error"] . "<br>";
}
else
{
echo "上傳文件名: " . $_FILES["myfile"]["name"] . "<br>";
echo "文件類(lèi)型: " . $_FILES["myfile"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["myfile"]["size"] / 1024) . " kB<br>";
echo "文件臨時(shí)存儲(chǔ)的位置: " . $_FILES["myfile"]["tmp_name"] . "<br>";
// 判斷當(dāng)期目錄(即www文件夾中)下的 upload 目錄(自己創(chuàng)建,名字自?。┦欠翊嬖谠撐募?
// 如果沒(méi)有 upload 目錄,你需要?jiǎng)?chuàng)建它,upload 目錄權(quán)限為 777
if (file_exists("upload/" . $_FILES["myfile"]["name"]))
{
echo $_FILES["myfile"]["name"] . " 文件已經(jīng)存在。 ";
}
else
{
// 如果 upload 目錄不存在該文件則將文件上傳到 upload 目錄下
move_uploaded_file($_FILES["myfile"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);//
echo "文件存儲(chǔ)在: " . "upload/" . $_FILES["myfile"]["name"];
}
}
}
else
{
echo "非法的文件格式";
}
?>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 簡(jiǎn)單實(shí)現(xiàn)Android文件上傳
- jQuery File Upload文件上傳插件使用詳解
- Servlet實(shí)現(xiàn)文件上傳,可多文件上傳示例
- 解決ASP.NET Core Mvc文件上傳限制問(wèn)題實(shí)例
- Android使用xUtils3.0實(shí)現(xiàn)文件上傳
- java web圖片上傳和文件上傳實(shí)例
- jQuery用FormData實(shí)現(xiàn)文件上傳的方法
- JS文件上傳神器bootstrap fileinput詳解
- jquery組件WebUploader文件上傳用法詳解
- 文件上傳的幾個(gè)示例分享【推薦】
- 詳解jQuery uploadify文件上傳插件的使用方法
相關(guān)文章
讓PHP開(kāi)發(fā)者事半功倍的十大技巧小結(jié)
在PHP中,單純按照自己思路去解決問(wèn)題往往會(huì)是一種錯(cuò)誤的辦法。這并不是因?yàn)槟闶且粋€(gè)糟糕的程序員,而是因?yàn)槿绻阆雽?xiě)出好的可維護(hù)性強(qiáng)的代碼,有些標(biāo)準(zhǔn)技巧是你必須要使用的。2010-04-04
PHP實(shí)現(xiàn)提取一個(gè)圖像文件并在瀏覽器上顯示的代碼
去年做過(guò)一個(gè)項(xiàng)目,要把用戶(hù)上傳的圖像文件列出文字清單,當(dāng)用戶(hù)點(diǎn)擊一個(gè)文件名后,就可以顯示這個(gè)圖像.今天有機(jī)會(huì)重新考慮這個(gè)功能,在php手冊(cè)中發(fā)現(xiàn)幾行代碼,簡(jiǎn)潔明快,完全能實(shí)現(xiàn)我要的功能,還不需要GD庫(kù)2012-10-10
PHP實(shí)現(xiàn)通用alert函數(shù)的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)通用alert函數(shù)的方法,實(shí)例分析了php自定義alert函數(shù)實(shí)現(xiàn)提示信息的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
PHP+Mysql基于事務(wù)處理實(shí)現(xiàn)轉(zhuǎn)賬功能的方法
這篇文章主要介紹了PHP+Mysql基于事務(wù)處理實(shí)現(xiàn)轉(zhuǎn)賬功能的方法,實(shí)例分析了mysql事務(wù)處理的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
安裝PHP可能遇到的問(wèn)題“無(wú)法載入mysql擴(kuò)展” 的解決方法
安裝PHP可能遇到的問(wèn)題“無(wú)法載入mysql擴(kuò)展” 的解決方法...2007-04-04
PHP設(shè)計(jì)模式之工廠(chǎng)模式(Factory Pattern)的講解
今天小編就為大家分享一篇關(guān)于PHP設(shè)計(jì)模式之工廠(chǎng)模式(Factory Pattern)的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
PHP實(shí)現(xiàn)廣度優(yōu)先搜索算法(BFS,Broad First Search)詳解
這篇文章主要介紹了PHP實(shí)現(xiàn)廣度優(yōu)先搜索算法(BFS,Broad First Search),簡(jiǎn)單描述了廣度優(yōu)先搜索算法的原理并結(jié)合具體實(shí)例分析了php實(shí)現(xiàn)廣度優(yōu)先搜索算法的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-09-09

