文件上傳類
1,確定檔案上傳類別的成員屬性
首先得考慮上傳檔案需要哪些屬性,我們可以隨便寫一個file檔案的post方式的表單提交,然後列印看看$_FILES裡有哪些參數
新file_upload_html.html檔案:
程式碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>用户头像上传</h2> <p>用户姓名:张三</p> 现有头像:<img src="" onerror="this.src='./default.jpg'"> <form method="post" enctype="multipart/form-data"> <input type="file" name="photo"><br> <input type="submit" value="上传"> </form> </body> </html>
取得表單提交的參數,新建file_upload_object.php,程式碼如下
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/3/3 0003 * Time: 上午 11:33 */ require './file_upload_html.html'; //获取表单提交的参数 $file=isset($_FILES['photo'])?$_FILES['photo']:""; echo "<pre>"; print_r($file); echo "</pre>";
提交表單之後列印結果如下:
由此可知道上傳檔案類別需要知道上傳的檔案名稱,檔案類型,錯誤標誌位元,上傳的大小
因此我們寫一個上傳檔案類別需要知道這些屬性,新建一個上傳檔案類別,FileUpload.Class.php
程式碼如下:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/3/3 0003 * Time: 上午 10:52 */ class FileUpload{ public $type=array( 'image/jpeg','image/pjpeg','image/png','image/x-png','image/gif' ); public $maxSize=1048576;//1M=1024*1024 public $uploadSavePath="./uploads"; public $errorMessage=""; }
2,檔案上傳類別的方法
對檔案上傳類別的屬性依照自己業務的需求寫一個方法來管理,
#例如上傳大小的設定,上傳儲存路徑的設定,方法名叫upload( )
具體程式碼如下:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/3/3 0003 * Time: 上午 10:52 */ class FileUpload{ private $type=array( 'image/jpeg','image/pjpeg','image/png','image/x-png','image/gif' );//文件类型 public $maxSize=1048576;//1M=1024*1024,上传的容量 public $uploadSavePath="./uploads"; //上传保存的路径 public $errorMessage=""; //错误信息 public function upload($file){ //上传类首先得判断上传存不存在错误,错误信息有123467六种情况,0为正常上传 if($file['error']>0){ $errorMsg="错误信息为:"; switch ($file['error']){ case 1:$errorMsg.="文件大小超过了php.ini中upload_max_filesize选项限制的值"; break; case 2:$errorMsg.="文件大小超过了表单中max_file_size选项指定的值!"; break; case 3:$errorMsg.="文件只有部分被上传!"; break; case 4:$errorMsg.="没有文件被上传!"; break; case 6:$errorMsg.="找不到临时文件夹!"; break; case 7:$errorMsg.="临时文件写入失败"; break; default:$errorMsg.='未知错误!'; break; } return false; } //判断上传的文件是否属于$type内 if(!in_array($file['type'],$this->type)){ //不在所属类型内时 $this->errorMessage="未定义的文件上传类型"; return false; } //判断文件上传的大小不能超过所定义的大小 if($file['size']>$this->maxSize){ $this->errorMessage="超出上传所限制的最大上传容量"; return false; } //给上传的图片重命名 $newFileName=uniqid("php_").strrchr($file['name'],"."); //设置上传文件的全目录 ./uploads/2018-03-03 $allPath1=$this->uploadSavePath."/".date("Y-m-d"); $allPath=$this->uploadSavePath."/".date("Y-m-d")."/".$newFileName; //判断这个目录是否存在 if(!file_exists($allPath1)){ mkdir($allPath1,'0777',true); } //移动 if(!move_uploaded_file($file['tmp_name'],$allPath)){ $this->errorMessage="文件上传失败"; }else{ return $allPath; }; } }
3,檔案上傳處理
對類別進行呼叫產生檔案上傳類別的物件並列印錯誤訊息
在file_upload_object.php裡修改程式碼如下:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/3/3 0003 * Time: 上午 11:33 */ require './FileUpload.class.php'; $file=isset($_FILES['photo'])?$_FILES['photo']:""; $fileUpload=new FileUpload(); $allPath=$fileUpload->upload($file); if(!$allPath){ //上传失败,打印错误信息 echo $fileUpload->errorMessage; //结束运行 die(); } require './file_upload_html.html';
在html頁面修改src屬性:
#程式碼如下:
<?php 现有头像:<img src="<?php echo $allFilePath; ?>" onerror="this.src='./default.jpg'">
#點選選擇檔,選好後點選上傳,結果如下:
#思考:很明顯上傳類別的頭像太大了,如何將上傳的頭像縮小一點?
(見[PHP]檔案與影像教學,裡面有詳細操作步驟)
##