PHP開發(fā)基礎(chǔ)教學(xué)之文件上傳
一、PHP檔案上傳
在我們?nèi)粘J褂弥谐3?huì)遇到很多種這樣的情況:
#QQ空間裡面上傳圖片呀
微信朋友圈上傳圖片
寄郵件裡面上傳郵件資料附件
認(rèn)證的時(shí)候要求上傳照片或身分證
?還有各種產(chǎn)品汪(gou)們提出的需求來(lái)分析,上傳不同的東西。
而產(chǎn)品汪提出來(lái)的需求我們需要實(shí)現(xiàn)。
實(shí)作檔案上傳,是PHP程式設(shè)計(jì)師必備的技能之一。
透過(guò)學(xué)習(xí)檔案上傳,你將透過(guò)使用的現(xiàn)像看到檔案上傳的本質(zhì)!
二、檔案上傳需要注意php.ini檔案
在正式解說(shuō)本章上傳前,我們第一件事情是要注意觀察php.ini檔案。
我們第一次開始接觸到如何修改php.ini文件,如果你的設(shè)定項(xiàng)與我們說(shuō)的不一致,請(qǐng)注意修改。
我們來(lái)了解每一個(gè)組態(tài)項(xiàng)目。
我們來(lái)看看如何修改php.ini。
開啟phpstudy中的php.ini設(shè)定檔。
?
php.ini的檔案太多,找不到的時(shí)候可以用ctrl+f 搜尋相關(guān)設(shè)定項(xiàng)。
??
建議尺寸:?file_size(檔案大小) < upload_max_filesize < post_max_size < memory_limit
另外,需要注意的是腳本執(zhí)行時(shí)間。
max_execution_time,這什參數(shù)的單位為秒。
這個(gè)參數(shù)是設(shè)定腳本的最大執(zhí)行時(shí)間。
也可以根據(jù)需求做適當(dāng)?shù)母淖儭Mǔ2恍枰獊?lái)修改,系統(tǒng)預(yù)設(shè)值即可。超大檔案上傳的時(shí)候,可能會(huì)牽涉到這項(xiàng)參數(shù)的修改。
上傳時(shí)間太長(zhǎng)了,會(huì)逾時(shí)。如果你將此項(xiàng)參數(shù)設(shè)為0,則是不限制逾時(shí)時(shí)間,不建議使。
完成了php.ini的相關(guān)配置,我們就可以開始試著完成第一次檔案上傳了。
三、檔案上傳的步驟
#為了更好的學(xué)習(xí)PHP,我們將極為複雜的PHP的檔案上傳歸納總結(jié)成為了6個(gè)步驟。
在實(shí)際使用過(guò)程中,你依照這6個(gè)步驟就能夠很好的完成PHP的檔案上傳:
1.判斷是否有錯(cuò)誤碼
#系統(tǒng)傳回的錯(cuò)誤碼詳解:
#註:錯(cuò)誤碼中沒(méi)有5
2.自訂判斷是否超出檔案大小範(fàn)圍
在開發(fā)上傳功能時(shí)。我們作為開發(fā)人員,除了php.ini中規(guī)定的上傳的最大值外。
我們通常也會(huì)設(shè)定一個(gè)值,是業(yè)務(wù)規(guī)定的上傳大小限制。
例如:
新浪微博或QQ空間只準(zhǔn)單張頭像圖片2M。而在上傳圖冊(cè)的時(shí)候又可以超過(guò)2M來(lái)上傳。
所以說(shuō),它的系統(tǒng)是支援更大檔案上傳的。
此處的判斷檔案大小,我們用來(lái)限制實(shí)際業(yè)務(wù)中我們想要規(guī)定的上傳的檔案大小。
3.判斷後綴名和mime型別是否符合
在網(wǎng)路世界裡面也有壞人。他們會(huì)把圖片插入病毒,在附件中上傳病毒,他們會(huì)在網(wǎng)頁(yè)中插入病毒或黃色圖片。
我們需要對(duì)於上傳的檔案後綴和mime類型都要進(jìn)行判斷才可以。
MIME(Multipurpose Internet Mail Extensions)是多用途互聯(lián)網(wǎng)郵件擴(kuò)充類型。是設(shè)定某種副檔名的檔案用一種應(yīng)用程式來(lái)開啟的方式類型,當(dāng)該副檔名檔案被存取的時(shí)候,瀏覽器會(huì)自動(dòng)使用指定應(yīng)用程式來(lái)開啟。多用於指定一些客戶端自訂的檔案名,以及一些媒體檔案開啟方式。
在判斷後綴和MIME類型的時(shí)候,我們會(huì)用到PHP的一個(gè)函數(shù)in_array(),該函數(shù)傳入兩個(gè)參數(shù)。
第一個(gè)參數(shù)是要判斷的值;
第二個(gè)參數(shù)是範(fàn)圍陣列。
我們用這個(gè)函數(shù)來(lái)判斷檔案的後綴名稱和mime類型是否在允許的範(fàn)圍內(nèi)。
4.產(chǎn)生檔案名稱
我們的檔案上傳成功了,不會(huì)讓它儲(chǔ)存原名。
因?yàn)?,有些人在原名中有敏感關(guān)鍵字會(huì)違反我國(guó)的相關(guān)法律和法規(guī)。
我們可以採(cǎi)用date()、mt_rand()或unique()產(chǎn)生隨機(jī)的檔案名稱。
?
5.判斷是否為上傳檔案
#檔案上傳成功時(shí),系統(tǒng)會(huì)將上傳的暫存檔案上傳到系統(tǒng)的暫存目錄中。產(chǎn)生一個(gè)臨時(shí)文件。
同時(shí)會(huì)產(chǎn)生暫存檔案名稱。我們需要做的事情是將臨時(shí)檔案移到系統(tǒng)的指定目錄中。
而移動(dòng)前不能瞎移動(dòng),或是移動(dòng)錯(cuò)了都是不科學(xué)的。移動(dòng)前我們需要使用相關(guān)函數(shù)判斷上傳的檔案是不是暫存檔案。
is_uploaded_file()傳入一個(gè)參數(shù)($_FILES中的快取檔案名稱),判斷傳入的名稱是不是上傳檔案
6.移動(dòng)暫存檔案到指定位置
臨時(shí)文件是真實(shí)的臨時(shí)文件,我們需要將其移動(dòng)到我們的網(wǎng)站目錄下面了。
讓我們網(wǎng)站目錄的數(shù)據(jù),其他人可以存取。
我們使用:move_uploaded_file()。
這個(gè)函數(shù)是將上傳檔案移到指定位置,並命名。
傳入兩個(gè)參數(shù):
第一個(gè)參數(shù)是指定移動(dòng)的上傳檔案;
第二個(gè)參數(shù)是指定的資料夾和名稱拼接的字串
四、檔案上傳表單注意事項(xiàng)
#我們開始正式的學(xué)習(xí),學(xué)習(xí)如何來(lái)上傳檔案。上傳文件必須在網(wǎng)頁(yè)中準(zhǔn)備好一個(gè)form表單。
這是一個(gè)簡(jiǎn)單的HTML頁(yè)面表單,form表單為檔案內(nèi)容準(zhǔn)備了一個(gè)專用的類,當(dāng)input?裡面?的 type=file 時(shí),預(yù)設(shè)為上傳檔案內(nèi)容。
我們來(lái)看看表單的程式碼和注意項(xiàng)目
<html> <head> <meta charset="utf-8" /> <title>單文件上傳</title> </head> <body> <form action="file.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上傳"> </form> </body> </html>
註:
form 表單中的參數(shù)method 必須為post。若為get是無(wú)法進(jìn)行檔案上傳的
?enctype必須為multipart/form-data
1.系統(tǒng)函數(shù)$_FILES
form表單提交的檔案內(nèi)容指向了file.php 。我們?cè)趂ile.php中,透過(guò)PHP程式碼,來(lái)處理上傳檔案。
我們選擇一個(gè)名為圖片進(jìn)行上傳。假設(shè)圖片的名字為:hua.jpg,點(diǎn)選上傳。 PHP為檔案類別資料準(zhǔn)備了一個(gè)專用的系統(tǒng)函數(shù)$_FILES,上傳檔案的所有相關(guān)數(shù)據(jù),都保存在這個(gè)系統(tǒng)函數(shù)中。
在PHP檔案中,我們印出$_FILES ,來(lái)觀察這個(gè)陣列的結(jié)構(gòu):
<?php //var_dump()或print_r() //打印變量的相關(guān)信息,將變量的信息詳細(xì)的展示出來(lái) var_dump($_FILES); ?>
列印出來(lái)的結(jié)果的陣列結(jié)構(gòu)如下:
#得到了上面的陣列結(jié)構(gòu)。
我們就可以開始文件的處理過(guò)程了。
2.判斷錯(cuò)誤碼<?php
if($_FILES['file']['error'] > 0){
switch ($_FILES['file']['error']) { //錯(cuò)誤碼不為0,即文件上傳過(guò)程中出現(xiàn)了錯(cuò)誤
case '1':
echo '文件過(guò)大';
break;
case '2':
echo '文件超出指定大小';
break;
case '3':
echo '只有部分文件被上傳';
break;
case '4':
echo '文件沒(méi)有被上傳';
break;
case '6':
echo '找不到指定文件夾';
break;
case '7':
echo '文件寫入失敗';
break;
default:
echo "上傳出錯(cuò)<br/>";
}
}else{
//錯(cuò)誤碼為0,即上傳成功,可以進(jìn)行后續(xù)處理,處理流程見下文
}
?>
上面的程式碼詳細(xì)的介紹了錯(cuò)誤碼和對(duì)應(yīng)的錯(cuò)誤,我們可以根據(jù)錯(cuò)誤碼,來(lái)產(chǎn)生準(zhǔn)確的錯(cuò)誤提示。
//判斷錯(cuò)誤 if($_FILES['file']['error'] > 0){ //有錯(cuò)誤可停止執(zhí)行 }else{ //當(dāng)前上傳文件無(wú)誤,運(yùn)行本段代碼 //判斷文件是否超出了指定的大小 //單位為byte $MAX_FILE_SIZE = 100000; if($_FILES['file']['size'] > $MAX_FILE_SIZE){ //判斷,如果上傳的文件,大小超出了我們給的限制范圍,退上傳并產(chǎn)生錯(cuò)誤提示 exit("文件超出指定大小"); }###將我們指定的檔案大小,定義為$MAX_FILE_SIZE,變數(shù)的計(jì)數(shù)單位為byte,對(duì)應(yīng)上傳檔案的 $_FILES['file']['size']大小。 ###範(fàn)例程式碼中,限制大小約為100K及以下的檔案。 #########4.判斷文件的mime類型是否正確#########更多的時(shí)候,我們的文件上傳功能,都需要判斷用戶上傳的文件,是否符合要求,不可用的文件上傳以後,對(duì)於線上應(yīng)用的整體展示效果,會(huì)造成惡劣的影響。所以我們需要透過(guò)mime類型和後綴名,來(lái)判斷用戶上傳的檔案是否符合要求。 ######下面的範(fàn)例程式碼中,我們假設(shè)當(dāng)前的專案需求為指定上傳圖片,要求上傳後綴名為GIF或jpg的文件,當(dāng)使用者上傳不符合要求的檔案時(shí),會(huì)傳回錯(cuò)誤提示。 ###
/*判斷后綴名和MIME類型是否符合指定需求 例如: 當(dāng)前項(xiàng)目指定上傳后綴為.jpg或.gif的圖片,則$allowSuffix = array('jpg','gif'); */ //定義允許的后綴名數(shù)組 $myImg = explode('.', $_FILES['file']['name']); /* explode() 將一個(gè)字符串用指定的字符切割,并返回一個(gè)數(shù)組,這里我們將文件名用'.''切割,結(jié)果存在$myImg中,文件的后綴名即為數(shù)組的最后一個(gè)值 */ $myImgSuffix = array_pop($myImg); /* 根據(jù)上傳文件名獲取文件的后綴名 使用in_array()函數(shù),判斷上傳文件是否符合要求 當(dāng)文件后綴名不在我們?cè)试S的范圍內(nèi)時(shí)退出上傳并返回錯(cuò)誤信息 */ if(!in_array($myImgSuffix, $allowSuffix)){ exit("文件后綴名不符"); } /* mime類型和文件后綴名的對(duì)應(yīng)關(guān)系,我們可以通過(guò)很多途徑查詢到,為了避免用戶自主修改文件后綴名造成文件無(wú)法使用。 mime類型也必須做出限制檢查mime類型,是為了防止上傳者直接修改文件后綴名 導(dǎo)致文件不可用或上傳的文件不符合要求。 */ //數(shù)組內(nèi)容為允許上傳的mime類型 $allowMime = array( "image/jpg", "image/jpeg", "image/pjpeg", "image/gif" ); if(!in_array($_FILES['file']['type'], $allowMime)){ //判斷上傳文件的mime類型是否在允許的范圍內(nèi) exit('文件格式不正確,請(qǐng)檢查'); //如果不在允許范圍內(nèi),退出上傳并返回錯(cuò)誤信息 }######5.產(chǎn)生指定的路徑和檔案名稱######
依照專案的檔案安排,產(chǎn)生檔案儲(chǔ)存路徑,為了避免檔案名稱重複而產(chǎn)生的錯(cuò)誤,依照一定的格式,產(chǎn)生一個(gè)隨機(jī)檔案名稱。
//指定上傳文件夾 $path = "upload/images/"; /* 根據(jù)當(dāng)前時(shí)間生成隨機(jī)文件名,本行代碼是使用當(dāng)前時(shí)間 + 隨機(jī)一個(gè)0-9的數(shù)字組合成文件名,后綴即為前面取到的文件后綴名 */ $name = date('Y').date('m').date("d").date('H').date('i').date('s').rand(0,9).'.'.$myImgSuffix;
6.判斷是否為上傳檔案
is_uploaded_file()函數(shù)是專用的函數(shù),來(lái)判斷目標(biāo)檔案是否是上傳檔案。
<?php //使用is_uploaded_file()判斷是否是上傳文件,函數(shù)介紹見上文 if(is_uploaded_file($_FILEs['file']['tmp_name'])){ } ?>
7.移動(dòng)檔案到指定位置
使用move_uploaded_file()函數(shù),將檔案移到指定的位置,並命名。要注意的是,Linux系統(tǒng)中對(duì)目標(biāo)目錄是否有權(quán)限及磁碟空間是否足夠,否則會(huì)導(dǎo)致上傳操作失敗。
/* 使用move_uploaded_file()移動(dòng)上傳文件至指定位置,第一個(gè)參數(shù)為上傳文件,第二個(gè)參數(shù)為我們?cè)谇懊嬷付ǖ纳蟼髀窂胶兔Q。 */ if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){ //提示文件上傳成功 echo "上傳成功"; }else{ /* 文件移動(dòng)失敗,檢查磁盤是否有足夠的空間,或者linux類系統(tǒng)中文件夾是否有足夠的操作權(quán)限 */ echo '上傳失敗'; } }else{ echo '不是上傳文件'; } } ?>
完整程式碼如下:
<?php if ($_FILES['file']['error'] > 0) { switch ($_FILES['file']['error']) { //錯(cuò)誤碼不為0,即文件上傳過(guò)程中出現(xiàn)了錯(cuò)誤 case '1': echo '文件過(guò)大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上傳'; break; case '4': echo '文件沒(méi)有被上傳'; break; case '6': echo '找不到指定文件夾'; break; case '7': echo '文件寫入失敗'; break; default: echo "上傳出錯(cuò)<br/>"; } } else { $MAX_FILE_SIZE = 100000; if ($_FILES['file']['size'] > $MAX_FILE_SIZE) { exit("文件超出指定大小"); } $allowSuffix = array( 'jpg', 'gif', ); $myImg = explode('.', $_FILES['file']['name']); $myImgSuffix = array_pop($myImg); if (!in_array($myImgSuffix, $allowSuffix)) { exit("文件后綴名不符"); } $allowMime = array( "image/jpg", "image/jpeg", "image/pjpeg", "image/gif", ); if (!in_array($_FILES['file']['type'], $allowMime)) { exit('文件格式不正確,請(qǐng)檢查'); } $path = "upload/images/"; $name = date('Y') . date('m') . date("d") . date('H') . date('i') . date('s') . rand(0, 9) . '.' . $myImgSuffix; if (is_uploaded_file($_FILEs['file']['tmp_name'])) { if (move_uploaded_file($_FILEs['file']['tmp_name'], $path . $name)) { echo "上傳成功"; } else { echo '上傳失敗'; } } else { echo '不是上傳文件'; } } ?>
六、多檔案上傳
#介紹了PHP上傳單一檔案的過(guò)程。但有些時(shí)候,為了使用方便,我們需要滿足同時(shí)上傳多個(gè)檔案的需求。多文件上傳原理相同,不過(guò)在處理資料時(shí),需要對(duì)上傳資料進(jìn)行特殊處理。
<html> <head> <meta charset="utf-8" /> <title>單文件上傳</title> </head> <body> <form action="morefile.php" method="post" enctype="multipart/form-data"> <input type="file" name="file[]"> <input type="file" name="file[]"> <input type="submit" value="上傳"> </form> </body> </html>
這裡有一個(gè)簡(jiǎn)易的上傳頁(yè)面,form表單同時(shí)提交了兩個(gè)檔案。我們 可以透過(guò)這個(gè)頁(yè)面提交內(nèi)容。
註:
?input type="file" name="file[]"與之前比較file後多加了一個(gè)中括號(hào)
寫了2個(gè)或多個(gè)input type="file" name="file[]"?
我們使用$_FILES 來(lái)接收檔案訊息,列印並查看陣列:
<?php var_dump($_FILES); //打印$_FILES查看數(shù)組結(jié)構(gòu) ?>
陣列結(jié)構(gòu)如右所示
我們可以看到,兩個(gè)檔案被儲(chǔ)存在一個(gè)陣列中,鍵名和上傳單檔是相同。所以,需要我們用for()循環(huán),來(lái)分別取出兩個(gè)檔案的需要用到的資料。
在$_FILES中同時(shí)保存了兩個(gè)檔案的數(shù)據(jù),我們需要使用一個(gè)簡(jiǎn)單的循環(huán),來(lái)讀取單一檔案的信息,並將檔案移到我們想要放的位置。
for ($i=0; $i < count($_FILE['file']['name']); $i++) { /* 用is_uploaded_file()函數(shù)判斷是上傳文件 并且沒(méi)有出現(xiàn)錯(cuò) */ if(is_uploaded_file($_FILEs['file']['tmp_name'][$i]) && $_FILEs['file']['error'][$i] == 0){ if(move_uploaded_file($_FILEs['file']['tmp_name'][$i],'upload/'.$_FILE['file']['name'][$i])){ //用move_uploaded_file()函數(shù)移動(dòng)文件到指定的位置并使用文件原名 echo "上傳成功"; }else{ echo '上傳失敗'; } }else{ echo '上傳失敗'; } }
詳細(xì)的判斷過(guò)程,請(qǐng)參考單一檔案上傳,這裡只做了基本的判斷,並沒(méi)有對(duì)檔案的大小及格式提醒。?
請(qǐng)依照業(yè)務(wù),自行判斷檔案大小及格式進(jìn)行錯(cuò)誤提醒。
七、檔案上傳進(jìn)度處理
#當(dāng)檔案過(guò)大,或是使用者網(wǎng)路狀態(tài)一般,通常上傳過(guò)程需要一段時(shí)間,如果這時(shí)候讓用戶白屏等待的話,相信大部分用戶都會(huì)直接關(guān)掉應(yīng)用,所以一個(gè)監(jiān)控上傳進(jìn)度,並實(shí)時(shí)向用戶報(bào)告的需求就被產(chǎn)品汪擺在了桌面上。一個(gè)高逼格的上傳進(jìn)度提示,會(huì)讓你的應(yīng)用程式瞬間變成被仰望的存在。
PHP在5.4之前,總是需要安裝額外的擴(kuò)充功能才能監(jiān)控到檔案上傳進(jìn)度。而從5.4開始,引入session.upload_progress的新特性,我們只需要在php.ini開啟配置,即可透過(guò)session監(jiān)控檔案上傳進(jìn)度。在php.ini中。
註:本章學(xué)習(xí)需要有session基礎(chǔ)和javascript和ajax基礎(chǔ)。
我們需要配置,注意查看和修改php.ini檔案:
開啟了配置,我們可以透過(guò)session,來(lái)記錄一個(gè)完整的檔案上傳進(jìn)度。在session中,會(huì)出現(xiàn)一個(gè)如下結(jié)果的陣列:
$_SESSION["upload_progress_test"] = array( //請(qǐng)求時(shí)間 "start_time" => 1234567890, // 上傳文件總大小 "content_length" => 57343257, //已經(jīng)處理的大小 "bytes_processed" => 453489, //當(dāng)所有上傳處理完成后為TRUE,未完成為false "done" => false, "files" => array( 0 => array( //表單中上傳框的名字 "field_name" => "file1", //上傳文件的名稱 "name" => "test1.avi", //緩存文件,上傳的文件即保存在這里 "tmp_name" => "/tmp/phpxxxxxx", //文件上傳的錯(cuò)誤信息 "error" => 0, //是否上傳完成,當(dāng)這個(gè)文件處理完成后會(huì)變成TRUE "done" => true, //這個(gè)文件開始處理時(shí)間 "start_time" => 1234567890, //這個(gè)文件已經(jīng)處理的大小 "bytes_processed" => 57343250, ), 1 => array( "field_name" => "file2", "name" => "test2.avi", "tmp_name" => NULL, "error" => 0, "done" => false, "start_time" => 1234567899, "bytes_processed" => 54554, ), ) );
這個(gè)陣列詳細(xì)記錄了檔案上傳的進(jìn)度,已經(jīng)處理完的檔案狀態(tài)為true。下面,我們透過(guò)一個(gè)jQuery的AJAX實(shí)例,來(lái)學(xué)習(xí)一下檔案上傳進(jìn)度的流程。
首先,在表單中,需要新增一個(gè)type=hidden 的input 標(biāo)籤,標(biāo)籤value 為自訂(建議使用有一定意義的值,因?yàn)檫@個(gè)值將會(huì)在背景使用到)
<form id="upload-form" action="upload.php" method="POST" enctype="multipart/form-data" style="margin:15px 0" target="hidden_iframe"> <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="test" /> <p><input type="file" name="file1" /></p> <p><input type="submit" value="Upload" /></p> </form> <div id="progress" style="margin-bottom:15px;display:none;"> <div>0%</div> </div>
這裡,新增了一個(gè)ID為progress的div,作為展示上傳進(jìn)度的容器。我們透過(guò)js的setTimeout(),定時(shí)執(zhí)行ajax來(lái)取得檔案上傳進(jìn)度,後臺(tái)檔案?jìng)骰貦n案上傳的進(jìn)度百分比。
<script src="../jquery/1.8.2/jquery.min.js"></script> <script type="text/javascript"> function fetch_progress(){ $.get('progress.php',{ '<?php echo ini_get("session.upload_progress.name"); ?>' : 'test'}, function(data){ var progress = parseInt(data); $('#progress .label').html(progress + '%'); if(progress < 100){ setTimeout('fetch_progress()', 100); //當(dāng)上傳進(jìn)度小于100%時(shí),顯示上傳百分比 }else{ $('#progress .label').html('完成!'); //當(dāng)上傳進(jìn)度等于100%時(shí),顯示上傳完成 } }, 'html'); } $('#upload-form').submit(function(){ $('#progress').show(); setTimeout('fetch_progress()', 100);//每0.1秒執(zhí)行一次fetch_progress(),查詢文件上傳進(jìn)度 }); </script>
上面這段程式碼,就是透過(guò)JQ的ajax,每0.1秒回傳一次檔案上傳進(jìn)度。並把進(jìn)度百分比在div 標(biāo)籤中顯示。
後臺(tái)程式碼,需要分成兩個(gè)部分,upload.php處理上傳檔案。 progress.php 取得session中的上傳進(jìn)度,並傳回進(jìn)度百分比。
這裡檔案上傳就不再贅述,詳細(xì)步驟參考上文,upload.php:
<?php if(is_uploaded_file($_FILES['file1']['tmp_name'])){ //判斷是否是上傳文件 //unlink($_FILES['file1']['tmp_name']); move_uploaded_file($_FILES['file1']['tmp_name'], "./{$_FILES['file1']['name']}"); //將緩存文件移動(dòng)到指定位置 } ?> 主要關(guān)注progress.php: <?php /* 開啟session。請(qǐng)注意在session_start()之前,請(qǐng)不要有想瀏覽器輸出內(nèi)容的動(dòng)作,否則可能引起錯(cuò)誤。 */ session_start(); //ini_get()獲取php.ini中環(huán)境變量的值 $i = ini_get('session.upload_progress.name'); //ajax中我們使用的是get方法,變量名稱為ini文件中定義的前綴 拼接 傳過(guò)來(lái)的參數(shù) $key = ini_get("session.upload_progress.prefix") . $_GET[$i]; //判斷 SESSION 中是否有上傳文件的信息 if (!empty($_SESSION[$key])) { //已上傳大小 $current = $_SESSION[$key]["bytes_processed"]; //文件總大小 $total = $_SESSION[$key]["content_length"]; //向 ajax 返回當(dāng)前的上傳進(jìn)度百分比。 echo $current < $total ? ceil($current / $total * 100) : 100; }else{ echo 100; } ?>
到這裡,檔案進(jìn)度的程式碼就已經(jīng)完成了,配合前端,我們就可以做一個(gè)酷炫的檔案上傳功能啦!
學(xué)習(xí)心得:牢記檔案上傳的六個(gè)步驟
?