国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP一步步實(shí)現(xiàn)文件上傳及上傳文件類

2024-09-04 11:45:13
字體:
供稿:網(wǎng)友

一,比較簡(jiǎn)單的實(shí)現(xiàn)文件上傳

文件上傳原理:文件上傳原理:將客戶端的文件先上傳到服務(wù)器端,然后再將服務(wù)器端的臨時(shí)文件移動(dòng)到指定的目錄。

客戶端配置:要上傳文件,我們需要采用表單,并且表單發(fā)送的形式來POST請(qǐng)求,而且要求將enctype設(shè)置為multipart/form-data,總結(jié)上傳的條件如下:

瀏覽器表單頁面:表單發(fā)送方式為post,指定enctype=multipart/form-data,客戶端的代碼:

  1. <form action="uploadFile.php" method="post" accept-charset="utf-8" enctype="multipart/form-data"
  2.     請(qǐng)選擇要上傳的文件: 
  3.     <input type="file" name="myfile"
  4.     <input type="submit" value="上傳文件"
  5. </form> 

$_FILES文件變量,下面是上傳一個(gè)圖片然后打印整理出來的數(shù)據(jù):

  1. // name => 'QC8054R7QPGQ_1000x500.jpg' 
  2. // type => 'image/jpeg' 
  3. // tmp_name => '/Applications/MAMP/tmp/php/php1X5KZU' 
  4. // error => 0 
  5. // size => 229936 

$_FILES上傳的參數(shù)含義說明:

name:上傳的文件的名稱

type: 上傳的文件的MIME類型

tmp_name:文件上傳到服務(wù)器的臨時(shí)路徑

site:上傳的文件的大小

error:上傳的文件的錯(cuò)誤碼,0表示上傳成功UPLOAD_ERR_OK

移動(dòng)文件

移動(dòng)文件方式一:上傳文件到服務(wù)器端是在一個(gè)臨時(shí)路徑下,我們需要將文件移動(dòng)到指定的目錄下,我們可以通過下面的函數(shù)來實(shí)現(xiàn)移動(dòng):將指定的文件移到的目錄路徑下,要求待移動(dòng)的文件是通過HTTP POST上傳的.

bool move_uploaded_file ( string $filename , string $destination )

我們需要判斷一下是否是通過HTTP POST上傳的,下面的方法可以判斷:判斷文件是否是通過HTTP POST上傳的,如果是返回TRUE,否則返回FALSE

bool is_uploaded_file ( string $filename )

移動(dòng)文件方式二:

我們還可以通過下面的函數(shù)來實(shí)現(xiàn)移動(dòng)文件:

參數(shù)一:待移動(dòng)的文件

參數(shù)二:移動(dòng)到的目標(biāo)路徑

bool copy ( string $source , string $dest [, resource $context ] )

處理上傳:

  1. define('UPLOAD_PATH''Uploads'); 
  2.  
  3. $name = $_FILES['myfile']['name']; 
  4. $type = $_FILES['myfile']['type']; 
  5. $tmp_name = $_FILES['myfile']['tmp_name']; 
  6. $error = $_FILES['myfile']['error']; 
  7. $size = $_FILES['myfile']['size']; 
  8.  
  9. if ($error == UPLOAD_ERR_OK) { 
  10.     if (is_uploaded_file($tmp_name)) { 
  11.         move_uploaded_file($tmp_name, UPLOAD_PATH . '/' . $name); 
  12.     } else { 
  13.         if (is_file($tmp_name) && !copy($tmp_name, UPLOAD_PATH . '/' . $name)) { 
  14.             var_dump('ok'); 
  15.         } //Vevb.com 
  16.     } 
  17. else { 
  18.     // 上傳到服務(wù)器就已經(jīng)出錯(cuò)了 
  19.     var_dump($error); 

php.ini上傳配置:

假設(shè)我們要支持上傳20M的文件,那么我們可以設(shè)置以下選項(xiàng):

一定要設(shè)置為On,才能上傳文件,若設(shè)置為Off,則服務(wù)器是接收不到文件數(shù)據(jù)的

file_uploads = On

指定上傳文件到服務(wù)器的臨時(shí)目錄,默認(rèn)為不打開的,可以不寫

upload_tmp_dir = "d:/uploads_tmp"

支持上傳的文件的最大為20M

upload_max_filesize = 20M

設(shè)置POST請(qǐng)求允許一次請(qǐng)求的最大值為100M

post_max_size = 100M

上傳操作允許的最長(zhǎng)時(shí)間,超過600秒則會(huì)停止腳本運(yùn)行,0表示無限制

max_execution_time = 600

PHP腳本解析請(qǐng)求數(shù)據(jù)所用的最大時(shí)間,默認(rèn)為60秒,0表示無限制

max_input_time = 600

單個(gè)PHP腳本所能申請(qǐng)的最大內(nèi)存,-1表示無限制!

memory_limit = 128M

上傳文件錯(cuò)誤碼:

UPLOAD_ERR_OK:代表上傳成功

UPLOAD_ERR_EXTENSION:上傳的文件被PHP擴(kuò)展程序中斷

UPLOAD_ERR_PARTIAL:文件只有部分被上傳

UPLOAD_ERR_CANT_WRITE:文件寫入失敗

UPLOAD_ERR_FORM_SIZE:表單文件超過了post_max_size

UPLOAD_ERR_INI_SIZE:文件大小超過了限制上傳的大小

UPLOAD_ERR_NO_FILE:沒有文件被上傳

UPLOAD_ERR_NO_TMP_DIR:找不到臨時(shí)目錄

客戶端限制上傳:

我們可以通過隱藏域來實(shí)現(xiàn)限制上傳的文件大小,同時(shí)可以通過accept來限制上傳的文件的類型,如下所示:

  1. <form action="uploadFile.php" method="post" accept-charset="utf-8" enctype="multipart/form-data"
  2.     <input type="hidden" name="MAX_FILE_SIZE" value="1024"
  3.     請(qǐng)選擇要上傳的文件: 
  4.     <input type="file" name="myfile" accept="image/png"
  5.     <input type="submit" value="上傳文件"
  6. </form> 

服務(wù)端限制上傳:

我們可以通過在服務(wù)端來判斷文件類型、文件大小,上傳方式等來判斷是否滿足條件,然后才處理文件!

  1. define('UPLOAD_PATH''Uploads'); 
  2. define('MAX_FILE_SIZE', 2 * 1024 * 1024); 
  3.  
  4. header('Content-type:text/html;Charset=utf-8'); 
  5.  
  6. $name = $_FILES['myfile']['name']; 
  7. $type = $_FILES['myfile']['type']; 
  8. $tmp_name = $_FILES['myfile']['tmp_name']; 
  9. $error = $_FILES['myfile']['error']; 
  10. $size = $_FILES['myfile']['size']; 
  11.  
  12. $allowExt = array('png''jpg''jpeg'); 
  13.  
  14. if ($error == UPLOAD_ERR_OK) { 
  15.     if ($size > MAX_FILE_SIZE) { 
  16.         exit('上傳的文件過大'); 
  17.     } 
  18.  
  19.     // 取上傳的文件的擴(kuò)展類型 
  20.     $ext = pathinfo($name, PATHINFO_EXTENSION); 
  21.     if (!in_array($ext$allowExt)) { 
  22.         exit('非法文件類型'); 
  23.     } 
  24.  
  25.     if (!is_uploaded_file($tmp_name)) { 
  26.         exit('文件不是HTTP POST上傳過來的'); 
  27.     } 
  28.  
  29.     if (move_uploaded_file($tmp_name, UPLOAD_PATH . '/' . $name)) { 
  30.         echo '文件上傳成功'
  31.     } else { 
  32.         echo "文件上傳失敗"
  33.     } 
  34. else { 
  35.     // 上傳到服務(wù)器就已經(jīng)出錯(cuò)了 
  36.     var_dump($error); 

忽略文件重名之類的問題,那些需要額外添加一些小處理哦!

二,上傳文件類

  1. ini_set('display_errors''On'); 
  2. error_reporting(E_ALL); 
  3. header('Content-type:text/html;Charset=utf-8'); 
  4.  
  5. /** 
  6. * Class for Uploading a single image   
  7. */ 
  8. class Upload { 
  9.     protected $fileName/* eg, $_FILES['file'], the name is file. */ 
  10.     protected $allowExt/* Allow extension for uploading a file */ 
  11.     protected $allowMIMEType;      /* Allow uploading file mine types */ 
  12.     protected $fileMaxSize/* Limit a uploading file size */ 
  13.     protected $uploadPath;  /* The destination path */ 
  14.     protected $isImageFlag;     /* Note that file is an image or not. */ 
  15.     protected $errorMessage;     
  16.     protected $fileExt
  17.     protected $fileInfos
  18.     protected $fileUniqueName
  19.     protected $fileDestPath
  20.  
  21.     public function __construct($fileName = 'file'$uploadPath = './Uploads'$isImageFlag = true, $fileMaxSize = 1048576, $allowExt = array('png''jpg''jpeg''gif'), $allowMIMEType = array('image/png''image/jpeg''image/gif')) { 
  22.         $this->fileName = $fileName
  23.         $this->allowExt = $allowExt
  24.         $this->allowMIMEType = $allowMIMEType
  25.         $this->uploadPath = $uploadPath
  26.         $this->isImageFlag = $isImageFlag
  27.         $this->fileMaxSize = $fileMaxSize
  28.         // print_r($_FILES); 
  29.         $this->fileInfos = $_FILES[$fileName]; 
  30.     } 
  31.  
  32.     public function uploadFile() { 
  33.         if ($this->isValidExt()  
  34.             && $this->isValidMIMEType()  
  35.             && $this->isValidFileSize()  
  36.             && $this->isRealImage() 
  37.             && $this->isHTTPPOST() 
  38.             && !$this->hasError()) { 
  39.             $this->isUploadPathExist(); 
  40.             $this->fileUniqueName = $this->getUniqueName(); 
  41.             $this->fileDestPath = $this->uploadPath . '/' . $this->fileUniqueName . '.' . $this->fileExt; 
  42. // echo iconv('gb2312', 'UTF-8', $this->fileDestPath); 
  43.             if (@move_uploaded_file($this->fileInfos['tmp_name'], $this->fileDestPath)) { 
  44.                 return $this->fileDestPath; 
  45.             } else { 
  46.                 $this->errorMessage = '文件上傳失敗'
  47.             } 
  48.         } else { 
  49.             $this->errorMessage = '文件上傳失敗'
  50.         } 
  51.  
  52.         exit('<span style="color:red">'.$this->errorMessage.'</span>');  
  53.     } 
  54.  
  55.     protected function hasError() { 
  56.         $ret = true; 
  57.  
  58.         if (!is_null($this->fileInfos)) { 
  59.             switch ($this->fileInfos['error']) { 
  60.                 case UPLOAD_ERR_INI_SIZE: 
  61.                    $this->errorMessage = '文件大小超過PHP.ini文件中upload_max_filesize'
  62.                    break
  63.                 case UPLOAD_ERR_FORM_SIZE: 
  64.                     $this->errorMessage = '文件大小超過了表單中MAX_FILE_SIZE設(shè)置的值'
  65.                     break
  66.                 case UPLOAD_ERR_NO_TMP_DIR: 
  67.                     $this->errorMessage = '找不到臨時(shí)文件目錄'
  68.                     break
  69.                 case UPLOAD_ERR_NO_FILE: 
  70.                     $this->errorMessage = '沒有選擇任何文件上傳'
  71.                     break
  72.                 case UPLOAD_ERR_CANT_WRITE: 
  73.                     $this->errorMessage = '文件不可寫'
  74.                     break
  75.                 case UPLOAD_ERR_PARTIAL: 
  76.                     $this->errorMessage = '只有部分文件被上傳'
  77.                     break
  78.                 case UPLOAD_ERR_EXTENSION: 
  79.                     $this->errorMessage = '文件上傳過程中被PHP擴(kuò)展程序中斷'
  80.                     break
  81.                 default
  82.                     $this->errorMessage = ''
  83.                     $ret = false; 
  84.             } 
  85.         } else { 
  86.             $this->errorMessage = '文件上傳出錯(cuò)'
  87.         } 
  88.  
  89.         return $ret
  90.     } 
  91.  
  92.     protected function isValidFileSize() { 
  93.         if ($this->fileInfos['size'] > $this->fileMaxSize) { 
  94.             $this->errorMessage = '文件太大'
  95.             return false; 
  96.         } 
  97.  
  98.         return true; 
  99.     } 
  100.  
  101.     protected function isValidExt() { 
  102.         $ext = pathinfo($this->fileInfos['name'], PATHINFO_EXTENSION); 
  103.         if (!in_array($ext$this->allowExt)) { 
  104.             $this->errorMessage = '不支持的文件類型'
  105.             return false; 
  106.         } 
  107.  
  108.         $this->fileExt = $ext
  109.         return true;; 
  110.     } 
  111.  
  112.     protected function isValidMIMEType() { 
  113.         $type = $this->fileInfos['type']; 
  114.  
  115.         if (!in_array($type$this->allowMIMEType)) { 
  116.             $this->errorMessage = '不支持的文件MIME類型'
  117.             return false; 
  118.         } 
  119.  
  120.         return true; 
  121.     } 
  122.  
  123.     protected function isHTTPPOST() { 
  124.         if (!is_uploaded_file($this->fileInfos['tmp_name'])) { 
  125.             $this->errorMessage = '文件不是通過HTTP POST傳上來的'
  126.  
  127.             return false; 
  128.         } 
  129.  
  130.         return true; 
  131.     } 
  132.  
  133.     protected function isRealImage() { 
  134.         if ($this->isImageFlag && !getimagesize($this->fileInfos['tmp_name'])) { 
  135.             $this->errorMessage = '文件不是圖片';  
  136.             return false; 
  137.         } 
  138.  
  139.         return true; 
  140.     } 
  141.  
  142.     protected function isUploadPathExist() { 
  143.         if (!file_exists($this->uploadPath)) { 
  144.             mkdir($this->uploadPath, 0777, true); 
  145.         }  
  146.     } 
  147.  
  148.     protected function getUniqueName() { 
  149.         return md5(microtime(true), true); 
  150.     } 
  151.  
  152. $upload = new Upload('myfile'); 
  153. if ($upload->uploadFile()) { 
  154.     echo "文件上傳成功"
  155. }

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安泽县| 沙雅县| 武鸣县| 潮州市| 咸宁市| 安徽省| 高安市| 大冶市| 襄城县| 来安县| 罗江县| 建昌县| 襄汾县| 义马市| 鄂温| 桐柏县| 清苑县| 望城县| 新丰县| 延长县| 玉溪市| 黄大仙区| 原阳县| 吉水县| 仪征市| 连云港市| 枣强县| 新龙县| 滨海县| 马山县| 顺义区| 华蓥市| 阳原县| 洞口县| 和政县| 铁岭市| 读书| 米脂县| 丹巴县| 孝感市| 商都县|