/**
*這是一個文件上傳類,用於處理上傳的文件,圖片等,可以自動產生縮圖,添加浮水印
*/
// +---------------------------------- --------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +---------------------------------------------- ------------------------
// | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
// +-- -------------------------------------------------- ------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +------ -------------------------------------------------- --------------
// | Author: hxsml
// +------------------------- ---------------------------------------------
// $Id : UploadFile.class.php v1.0
/**
+------------------------------------------------ ------------------------------
* 檔案上傳類別
*
* 修改:
* 多檔案上傳時,fileinfo以表單名字為key的陣列
+-------------------------------------------------- --------------------------------------
* @category ORG
* @package ORG
* @subpackage Net
* @author hxsml
* @version v1.0
+----------------------------------- -------------------------------------------
*/
class UploadFile {//類別定義開始
// 上傳檔案的最大
public $maxSize = -1;
// 是否支援多重檔案 // 是否支援多重檔案上傳
public $supportMulti = true;
// 允許上傳的檔案後綴
// 留空不作後綴檢查
public $allowExts = 留空不作後綴檢查
public $allowExts = arra(); public $allowTypes = array();
// 使用對上傳圖片進行縮圖處理
public $thumb = false;
// 圖庫類別包路徑
• public $imClass // 圖…略圖最大寬度
public $thumbMaxWidth;
// 縮圖最大高度
public $thumbMaxHeight;
// 縮略圖前綴 = public Suffix = '';
// 縮圖保存路徑
public $thumbPath = '';
// 縮圖檔案名稱
public $thumbFile
=
'';壓縮圖片檔上傳
public $zipImages = false; // 啟用子目錄儲存檔案 public $autoSub = false; // 子目錄建立方式可使用 hash; public $hashLevel = 1; // hash的目錄層級
// 上傳檔案保存路徑
public $savePath = '';
public $auCheckal = truetrue; $uploadReplace = false;
// 上傳檔案命名規則
// 例如可以是time uniqid com_create_guid 等
// 必須是一個不需要任何參數的函式名稱可以使用自訂功能
'
'o
'') // 上傳檔案Hash規則函數名稱
// 例如可以是md5_file sha1_file 等
public $hashType = 'md5_file';
// 錯誤訊息 uploadFileInfo ;
/**
+------------------------------------------------ ----------
* 架構函數
+---------------------------------- ------------------------
* @access public
+------------------ --------------------------------------- */ public function __construct($maxSize='',$allowExts='',$allowTypes='',$savePath='',$saveRule='') {
. !empty($maxSize) && is_numeric($maxSize)) {
$this->maxSize = $maxSize;
}) if(is_array($allowExts)) {
$this ->allowExts = array_map('strtolower',$allowExts);
}else {
$this->allowExts =explode(',',strtolower($allowExts));
類型 } )) {
if(is_array ($allowTypes)) {
$ 此->allowTypes = array_map('strtolower',$allowTypes);
}else {
) $ }
}
if(!空($saveRule )) {
$this->saveRule = $saveRule;
}else{
}
$this->savePath = $savePath;
} /** +------------------------------------------------ ---------- * 上傳一份檔案 +--------------------------------- -------------------------
* @access public
+------------------ ------------------------------------------
* @param mixed $name 資料
* @param string $value 資料表名
+---------------------------------------- ------------------
* @return string
+------------------------ ---------------------------------
* @throws ThinkExecption
+---------- ------------------------------------------------
*/
乾燥函數save($file) {
$filename = $file['savepath'].$file['savename'];
if(Replace!this-load filename)) {
// 不覆寫同名檔案
$this->error
= '檔案已存在! }
// 若是圖片檔案偵測檔案格式
if ( in_array(strtolower($file['extension']),array('gif','jpg','jpeg','bmp','png','swf')) && false === getimagesize($file ['tmp_name'])) {
$this->error = '非法檔案';
return false; return false; '], $this->auto_charset($filename,' utf-8','gbk'))) {
$this->error = '檔案上傳儲存錯誤!';
return false;
}
if($this->thumb && in_array(strtolower($file['extension)$file['arraension] in_array(strtolower($file'g')',$file['arraension'],_array(strtolower($file'g',)'pfile' png'))) {
$image = getimagesize($filename);
if(false !== $image) { 為文件 $thumbWidth
= 爆炸(',', $this ->thumbMaxWidth); $thumbHeight
=explode(',',$this->thumbMaxHeight)explode(',',$this->thumbMaxHeight); =
explode( ',',$ this->thumbPrefix ); $thumbSuffix =爆炸(',',$ this-> thumbsuffix);$thumbfile
=
Explode(',',$ this-> thumbfile);$ thumbpath = $ thumbpath = $thumbfile; thumbpath? $realFilename = $this->autoSub?basename ($ 檔案['savename'] ):$file[' savename']; for($i=0,$len=count($thumbWidth); $i
$thumbPath.$thumbPrefix [$i].substr ($realFilename,0,strrpos($realFilename, '.')).$thumbSuffix[$i].'.'.$file['extension'];
,$thumbname,'' ,$thumbWidth[$i],$thumbHeight[$i],true);
}
this // 之後產生了刪除原圖
unlink($ filename); } } } if($ }
return true;
}
圖片 /**
+------------------------------------------------ ----------
* 上傳所有檔案
+--------------------------------- -------------------------
* @access public
+------------------ ------------------------------------------
* @param string $savePath 上傳檔案儲存路徑
+----------------------------------------------- -----------
* @return string
+-------------------------------- --------------------------
* @throws ThinkExecption
+----------------- -----------------------------------------
*/
public function upload ( $儲存路徑='' ) {
//如果沒有指定儲存檔案名,則由系統預設
if(empty($savePath))
Path $savePath = $
// 檢查上傳目錄
if(!is_dir($savePath)) {
) {
$save路徑
=
base64_decode( $ savePath);
}else{
// 嘗試建立目錄
$this->error = '上傳目錄'.$save Path.'不存在';
return false;
}
}
}else {
if(!is_writeable($savePath)) {
$this->羅 return false;
}
}
$fileInfo = array();
$isUpload = false;
// 取得上傳的檔案資訊
// 對$_FILES陣列資訊處理
$filesthis_ foreach($files as $key => $file) {
//過濾無效的上傳 if(!empty($file['name'])) { 登錄文件 $file['key'] = $key; $ file['extension'] = $this->getExt($file['name']); $file['savepath'] = $save ($ file);
// 自動檢查配件
if($this->
return false;
if(!$ this->save($file)) return false;
if(function_exists($this->hashType)) {
類型 $ $file['hash'] = $fun($this- >auto_charset($file['savepath'].$file['savename'],'utf-8','gbk'));
} } unset( $file['tmp_name'],$file['error']);
$fileInfo[$key] = $file;
}
if($isUpload) {
$this-> uploadFileInfo = $fileInfo;
return true;
}else {
5 return false;
}
}
/**
+------------------------------------------------ ----------
* 上傳單一上傳欄位中的檔案支援多重附件
+-------------------------- --------------------------------
* @access public
+----------- -----------------------------------------------
* @ param array $file 上傳檔案資料
* @param string $savePath 上傳檔案儲存路徑
+------------------------------ ----------------------------
* @return string
+--------------- -------------------------------------------
* @throws ThinkExecption
+ -------------------------------------------------- --------
*/
public function uploadOne($file,$savePath=''){
//如果不指定儲存檔案$savePath = $this->savePath;
// 檢查上傳目錄
if(!is_dir($savePath)) {
嘗試創建目錄 000000000 目錄 {
$this->error = '上傳目錄'.$savePath.'不存在';
return false;
}
)) {
$this->error = '上傳目錄'.$savePath.'不可寫';
return false;
}
) {
$fileArray = array();
if(is_array($file[' name'])) {
$keys = array_keys($file);
for ($i=0; $i foreach ($keys as $key)
}
}else{
$fileArray[] = $file;
}
$info = array(); 檔案的擴充資訊 $file['extension'] = $this->getExt($file ['name']); $file['savepath'] = $savePath; // 自動檢查配件
if($this- >autoCheck) {
if(!$this->check($file))
}
//儲存上傳檔案
if(!$this-> function_exists($this->hashType)) {
$fun = $this->hashType;
to_charset($file['savepath'].$file[' savename'],'utf-8','gbk'));
}
unset($file['tmp_name'],$file['error']);
// 回傳的檔案資訊
return $info;
}else {
$ 。 ='gbk', $to='utf -8') {
$from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from;
$to = strtoupper($to) == 'UTF8' ? ' $to;
if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) { 內容或非字串標量則不轉換
return $fContents;
}
if (is_string($fents)) {funcfents) { coding')) {
return mb_convert_encoding($fContents, $to, $from);
} elseif (function_exists('iconv')) {
return iconv($from, $, $ffroms), $f Cont return $fContents;
}
} ($fContents as $key => $val) {
$_key = $this->auto_charset($key, $from, $to);
_$p. from, $to);
if ($key != $_key)
return $fContents;
}
else {
/**
+------------------------------------------------ ----------
* 轉換上傳檔案陣列變數為正確的方式
*
* 修改:
* 當設定name=upload[]時,key為「包含多個」, * 當設定name=upload[]。
* 件訊息的以數位化為引多維數組,name=upload1...,key為對應
* 的名字
+--------------------- -------------------------------------
* @access private
+------ -------------------------------------------------- --
* @param array $files 上傳的檔案變數
+----------------------------------- -----------------------
* @return array
+-------------------- --------------------------------------
*/
private function dealFiles($files) {
$fileArray = array();
foreach ($files as $file.> $名稱' ])) {
$keys = array_keys($file);
for ($i=0; $i foreach ($keys as $key)
}
}else{
$fileArray[$field] = $file;
}
}
return $fileArray;
}
/**
+------------------------------------------------ ----------
* 取得錯誤代碼資訊
+-------------------------------- --------------------------
* @access public
+---------------- -----------------------------------------
* @param string $errorNo 錯誤號碼
+------------------------------------------------ ----------
* @return void
+-------------------------------- -------------------------
* @throws ThinkExecption
+------------------ ----------------------------------------
*/
protected function error($errorNo) {
switch($errorNo) { $this->error = '上傳的檔案超過了php.ini 中upload_max_filesize 選項限制的值';
break;
case 2:
break;
case 3:
$this->error = '檔案->只有部分上傳';
break;
case 4:
break;
case 6:
$this->error = '找不到暫時資料夾';
break;
case 7:
break;
default:
$this->error = '未知上傳錯誤!';
}
return ;
}
/**
+------------------------------------------------ ----------
* 依上傳檔案命名規則取得保存檔案名稱
+--------------------------- -------------------------------
* @access private
+------------ ----------------------------------------------
* @param string $filename 資料
+-------------------------------------------- --------------
* @return string
+----------------------------- -----------------------------
*/
private function getSaven (this.
if(empty($rule)) { //沒有定義命名規則,則保持檔案名稱不變 //$saveName = $filename['name'];
$saveName = date('YmdHis').rand().".".$filename ['extension']; }else{
if(function_exists($ru $saveName = $rule().".".$filename[ 'extension']; }else {
//使用給定的檔案名稱為識別號碼 $. $.
}
}
if($this- >autoSub) {
// 使用子目錄儲存檔案
$filename['savename'] = $saveName; Name $filename['savename'] = $saveName; Name $Name $Name $Name-name $name.
}
return $ saveName;
}
/**
+------------------------------------------------ ----------
* 取得子目錄的名稱
+------------------------------- ---------------------------
* @access private
+---------------- ------------------------------------------
* @param array $file 上傳的文件資訊
+--------------------------------------------- -------------
* @return string
+------------------------------ ----------------------------
*/
private function getSubName($file) {
$dir = date($this->dateFormat, time());
break;
case 'hash':
$file['savename']);
$dir = '';
for($i=0;$ihashLevel;$i++) {
$dir .= $name{$i}.'/'; break;
}
if(!is_dir($file['savepath'].$dir) ) {
mk_dir($file['savepath'].$dir);
}
return $dir;
}
/**
+------------------------------------------------ ----------
* 檢查上傳的檔案
+-------------------------------- --------------------------
* @access private
+----------------- ------------------------------------------
* @param array $file 檔案訊息
+------------------------------------------------ ----------
* @return boolean
+--------------------------------- -------------------------
*/
private function check($file) {
if($file['error']!== 0) {
$this- >error($file['error']);
return false;
}
>checkSize($file[' size'])) {
$this->error = '上傳檔案大小不符! ';
return false;
}
//檢查檔案Mime類型
$this->error = '上傳檔案MIME類型不允許! ';
return false;
}
//檢查檔案類型
$this->error ='上傳檔案類型不允許';
return false;
}
//檢查是否合法上傳
if(!$this->checkUpload($file['tmp_name'])) {> ';
return false;
}
return true;
}
類型 / if(!empty($this->allowTypes))
返回in_array( strtolower ($type),$this->allowTypes);
return true;
}
/**
+------------------------------------------------ ----------
* 檢查上傳的檔案類型是否合法
+----------------------------- -----------------------------
* @access private
+-------------- --------------------------------------------
* @param string $ type 資料
+---------------------------------------------- ------------
* @return boolean
+------------------------------- ---------------------------
*/
私有函數
return in_array(strtolower($ext),$this->allowExts,true);
return true;
}
) 私有函數** return !( $大小> $這個->最大大小) || (-1 == $this->maxSize);
}
/**
+------------------------------------------------ ----------
* 檢查上傳的文件後綴是否合法
+----------------------------- -----------------------------
* @access private
+-------------- --------------------------------------------
* @param string $ ext 字尾名
+--------------------------------------------- -------------
* @return boolean
+------------------------------ ----------------------------
*/
private function checkUpload($filename) {
private function checkUpload($filename) {
private function checkUp }
/**
+------------------------------------------------ ----------
* 檢查檔案大小是否合法
+------------------------------- ---------------------------
* @access private
+---------------- ------------------------------------------
* @param integer $size 數據
+------------------------------------------------ ----------
* @return boolean
+--------------------------------- -------------------------
*/
private function getExt($filename) {
$pathinfo = pathinfo($filename); info $pathinfo = pathinfo($filename);
/**
+------------------------------------------------ ----------
* 取得上傳文件的資訊
+------------------------------- ---------------------------
* @access public
+---------------- ------------------------------------------
* @return array
+- -------------------------------------------------- -------
*/
public function getUploadFileInfo() {
return $this->uploadFileInfo;
return $this->error;
}
}
以上就介紹了thinkphp檔案上傳類,包括了方面的內容,希望對PHP教學有興趣的朋友有幫助。