php 依照陣列和步驟完成文件上傳

form表單提交的檔案內容指向了file.php。

我們在file.php中,透過PHP程式碼,來處理上傳檔案。

我們選擇一個名為圖片進行上傳。假設圖片的名字為:psu.jpg,點選上傳。

PHP為檔案類別資料準備了一個專用的系統函數$_FILES,上傳檔案的所有相關數據,都保存在這個系統函數中。

在PHP檔案中,我們印出$_FILES ,來觀察這個陣列的結構:

列印出來的結果的陣列結構如下:

array (size=1) 'file' => array (size=5) //文件名 'name' => string 'psu.jpg' (length=7) //文件的mime类型 'type' => string 'image/jpeg' (length=10) //缓存文件,上传的图片即保存在这里 'tmp_name' => string 'E:\wamp\tmp\phpC32A.tmp' (length=23) //错误码,详见上面错误码介绍 'error' => int 0 //上传的文件大小 'size' => int 225824

得到了上面的數組結構。

我們就可以開始文件的處理過程了。

第一步,判斷錯誤碼:

 0){ switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误 case '1': echo '文件过大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上传'; break; case '4': echo '文件没有被上传'; break; case '6': echo '找不到指定文件夹'; break; case '7': echo '文件写入失败'; break; default: echo "上传出错
"; } }else{ //错误码为0,即上传成功,可以进行后续处理,处理流程见下文 } ?>

上面的程式碼詳細的介紹了錯誤碼和對應的錯誤,我們可以根據錯誤碼,來產生準確的錯誤提示。

第二步,判斷檔案是否超出大小。在實際專案中,由於系統硬體的限制,以及儲存裝置的限制,不可能讓使用者無限的上傳文件,所以我們要對使用者上傳的檔案大小進行限制。定義一個適當的限制大小,能讓我們的應用更穩定的運作。

 0) { //有错误可停止执行 } else { //当前上传文件无误,运行本段代码 //判断文件是否超出了指定的大小 //单位为byte $MAX_FILE_SIZE = 100000; if ($_FILES['file']['size'] > $MAX_FILE_SIZE) { //判断,如果上传的文件,大小超出了我们给的限制范围,退上传并产生错误提示 exit("文件超出指定大小"); } } ?>

將我們指定的檔案大小,定義為$MAX_FILE_SIZE,變數的計數單位為byte,對應上傳檔案的 $_FILES['file']['size']大小。
範例程式碼中,限制大小約為100K及以下的檔案。

第三步,判斷檔案的mime類型是否正確。

更多的時候,我們的文件上傳功能,都需要判斷用戶上傳的文件,是否符合要求,不可用的文件上傳以後,對於線上應用的整體展示效果,會造成惡劣的影響。所以我們需要透過mime類型和後綴名,來判斷用戶上傳的檔案是否符合要求。

下面的範例程式碼中,我們假設當前的專案需求為指定上傳圖片,要求上傳後綴名為GIF或jpg的文件,當使用者上傳不符合要求的檔案時,會傳回錯誤提示。

第四步,產生指定的路徑和檔案名稱。

依照專案的檔案安排,產生檔案儲存路徑,為了避免檔案名稱重複而產生的錯誤,依照一定的格式,產生一個隨機檔案名稱。

第五步,判斷是否為上傳檔案。

is_uploaded_file()函數是專用的函數,來判斷目標檔案是否為上傳檔案。

第六步,移動檔案到指定位置。

使用move_uploaded_file()函數,將檔案移到指定的位置,並命名。要注意的是,Linux系統中對目標目錄是否有權限及磁碟空間是否足夠,否則會導致上傳操作失敗。

我們將這個檔案片段整理成一整個檔案:

 0) { switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误 case '1': echo '文件过大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上传'; break; case '4': echo '文件没有被上传'; break; case '6': echo '找不到指定文件夹'; break; case '7': echo '文件写入失败'; break; default: echo "上传出错
"; } } 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('文件格式不正确,请检查'); } $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 '不是上传文件'; } } ?>


#
繼續學習
||
0) { switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误 case '1': echo '文件过大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上传'; break; case '4': echo '文件没有被上传'; break; case '6': echo '找不到指定文件夹'; break; case '7': echo '文件写入失败'; break; default: echo "上传出错
"; } } 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('文件格式不正确,请检查'); } $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 '不是上传文件'; } } ?>
提交 重置程式碼
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!