PHP文件上傳操作實(shí)例詳解
本文實(shí)例分析了PHP文件上傳操作。分享給大家供大家參考,具體如下:
文件上傳
發(fā)生在瀏覽器向服務(wù)器發(fā)出的請(qǐng)求中。
文件,對(duì)于瀏覽器來(lái)講,就是表單中的一個(gè)特殊類(lèi)型的數(shù)據(jù)而已。
瀏覽器表單中的數(shù)據(jù),兩種類(lèi)型:
字符串類(lèi)型(字節(jié)流編碼)
文件類(lèi)型(二進(jìn)制編碼),文件是表單數(shù)據(jù)中一部分
服務(wù)器角度:
在接受瀏覽器請(qǐng)求時(shí),處理好表單內(nèi)的數(shù)據(jù)。根據(jù)數(shù)據(jù)類(lèi)型不同使用不同處理方法:
字符串類(lèi)型,存儲(chǔ)在$_POST變量中(內(nèi)存)
文件型數(shù)據(jù),存儲(chǔ)在上傳臨時(shí)目錄中
表單提交時(shí),瀏覽器會(huì)默認(rèn)的行為:
表單內(nèi)的的內(nèi)容都是字符串類(lèi)型,即使添加了文件域,需要在form上增加屬性,告知瀏覽器上傳的不止有字符串類(lèi)型數(shù)據(jù)。enctype="multipart/form-data"
<body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"> </br> <input type="submit" value="submit"> </form> </body>
php服務(wù)器在接收到文件類(lèi)型的表單數(shù)據(jù)后,將文件存儲(chǔ)于臨時(shí)目錄(屬于臨時(shí)文件,腳本周期內(nèi)有效)
; Temporary directory for HTTP uploaded files (will use system default if not ; specified). ; http://php.net/upload-tmp-dir ;upload_tmp_dir =
將臨時(shí)文件持久化存儲(chǔ)
move_uploaded_file(src_url,goa_url)
$_FILES,存儲(chǔ)了上傳文件的信息包括臨時(shí)地址
錯(cuò)誤類(lèi)型:
0-1-2-3-4-6-7
0表示沒(méi)有錯(cuò)誤
1表示文件大于php的設(shè)置
; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize = 2M
2表示文件大于表單設(shè)置max_file_size
<input type='hidden' name='MAX_FILE_SIZE' value='1024'>
3表示文件上傳不完整
4表示沒(méi)有上傳文件
5表示邏輯上上傳了0字節(jié)的文件(空文件)
6表示沒(méi)有找到臨時(shí)上傳目錄(權(quán)限不足)
7表示文件寫(xiě)入失?。ù疟P(pán)空間、權(quán)限)
php允許的最大上傳文件數(shù)量
; Maximum number of files that can be uploaded via a single request max_file_uploads = 20
post存在最大值限制
一旦超過(guò),php就不能正常處理post與file值可能為空值
; Maximum size of POST data that PHP will accept. ; http://php.net/post-max-size post_max_size = 8M
類(lèi)型檢測(cè)中
后綴名與mime都是瀏覽器提供的,需要php的擴(kuò)展fileinfo完成對(duì)文件信息的檢查(函數(shù)過(guò)程與面向?qū)ο螅?/p>
;extension=php_fileinfo.dll
$finfo = new Finfo(FILEINFO_MIME_TYPE); $mine_type = $finfo->file($file['tmp_name']);
分子目錄存儲(chǔ)上傳文件
原則:業(yè)務(wù)邏輯、文件數(shù)量、時(shí)間
創(chuàng)建目錄 mkdir()
檢查目錄 is_dir()
<?php upload($_FILES['file']); function upload($file){ if($file['error']!=0){ return false; } //3M $max_size = 3145728; if($max_size<$file['size']){ return false; } //設(shè)置一個(gè)后綴名與mime的映射關(guān)系 $type_map = array( '.jpeg'=>array('image/jpeg','image/pjpeg'), '.jpg'=>array('image/jpeg','image/pjpeg'), '.png'=>array('image/png','image/x-png'), '.gif'=>array('image/gif') ); //后綴 $allow_ext_list = array('.jpeg','.png','.jpg'); $ext = strtolower(strrchr($file['name'],'.')); if(!in_array($ext,$allow_ext_list)){ echo '不支持該圖片格式'; return false; } //MIME $allow_mime_list = array(); foreach($allow_ext_list as $val){ $allow_mime_list = array_merge($allow_mime_list,$type_map[$val]); } //瀏覽器提供信息堅(jiān)持 $allow_mime_list = array_unique($allow_mime_list); if(!in_array($file['type'],$allow_mime_list)){ echo '不支持該圖片格式'; return false; } //php自身檢查 $file_mime = new Finfo(FILEINFO_MIME_TYPE); $mime = $file_mime->file($file['tmp_name']); if(!in_array($mime,$allow_mime_list)){ echo '不支持該圖片格式'; return false; } //目錄存儲(chǔ) $up_loadpath = './'; $sub_dir = date('Ymdh'); if(!is_dir($up_loadpath.$sub_dir)){ mkdir($up_loadpath.$sub_dir); } $prefix = 'bee_'; $name = uniqid($prefix,true).$ext; if(move_uploaded_file($file['tmp_name'],$up_loadpath.$sub_dir.$name)){ echo '上傳成功'; return $name; }else{ echo '上傳失敗'; return false; } }
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php文件操作總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP動(dòng)態(tài)編譯出現(xiàn)Cannot find autoconf的解決方法
這篇文章主要介紹了PHP動(dòng)態(tài)編譯出現(xiàn)Cannot find autoconf的解決方法,是PHP程序設(shè)計(jì)中經(jīng)常會(huì)遇到的問(wèn)題,需要的朋友可以參考下2014-11-11php下把數(shù)組保存為文件格式的實(shí)例應(yīng)用
我們通常把一些常用的數(shù)據(jù)保存為數(shù)組格式方便調(diào)用,同時(shí)這也是緩存的重要方法。2010-02-02PHP+ajax實(shí)現(xiàn)上傳、刪除、修改單張圖片及后臺(tái)處理邏輯操作詳解
這篇文章主要介紹了PHP+ajax實(shí)現(xiàn)上傳、刪除、修改單張圖片及后臺(tái)處理邏輯操作,結(jié)合實(shí)例形式詳細(xì)分析了前臺(tái)ajax提交圖片上傳、刪除、修改以及后臺(tái)PHP邏輯處理相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-02-02詳解PHP實(shí)現(xiàn)HTTP服務(wù)器過(guò)程
一般來(lái)講,PHP很少談到“實(shí)現(xiàn)HTTP服務(wù)”的說(shuō)法,因?yàn)閺脑缙诘腃GI到后來(lái)的PHP-FPM,官方已經(jīng)給出了最穩(wěn)定的HTTP解決方案,你只要配合一個(gè)Apache或Nginx類(lèi)的服務(wù)器就能實(shí)現(xiàn)穩(wěn)定的HTTP服務(wù)2023-02-02Yii 使用intervention/image拓展實(shí)現(xiàn)圖像處理功能
這篇文章主要介紹了Yii 使用intervention/image拓展實(shí)現(xiàn)圖像處理功能,需要的朋友可以參考下2019-06-06php curl post 時(shí)出現(xiàn)的問(wèn)題解決
這篇文章主要介紹了php curl post 時(shí)出現(xiàn)問(wèn)題的解決方法,需要的朋友可以參考下2014-01-01php中time()與$_SERVER[REQUEST_TIME]用法區(qū)別
這篇文章主要介紹了php中time()與$_SERVER[REQUEST_TIME]用法區(qū)別,詳細(xì)分析了time()與$_SERVER[REQUEST_TIME]的用法,并以實(shí)例形式對(duì)比總結(jié)了二者在獲取當(dāng)前系統(tǒng)時(shí)間戳與請(qǐng)求時(shí)間戳的區(qū)別,需要的朋友可以參考下2014-11-11PHP簡(jiǎn)潔函數(shù)(PHP簡(jiǎn)單明了函數(shù)語(yǔ)法)
筆者由于碰到用戶(hù)多次修改頁(yè)面,所以在麻煩的情況下,改用php完成技術(shù)開(kāi)發(fā),這篇文章主要記錄PHP簡(jiǎn)潔函數(shù),講述PHP簡(jiǎn)單明了函數(shù)語(yǔ)法,適合人群為對(duì)開(kāi)源社區(qū)感興趣,對(duì)php感興趣,有一點(diǎn)時(shí)間了解下php,希望對(duì)讀者帶來(lái)快樂(lè)2012-06-06