一個(gè)非常實(shí)用的php文件上傳類
其實(shí)網(wǎng)上已經(jīng)有很多這樣的類了,不過出于練手的目的還是自己仿照著寫了一個(gè)。
下面的代碼放在一個(gè)名為UploadFile.class.php文件內(nèi)
<?php
/**
* 文件上傳
* author:師少兵
* email :beibeijing163@163.com
* time :2012/12/09
*/
class UploadFile{
private $max_size = '2000000'; //設(shè)置上傳文件的大小,此為2M
private $rand_name = true; //是否采用隨機(jī)命名
private $allow_type = array(); //允許上傳的文件擴(kuò)展名
private $error = 0; //錯(cuò)誤代號(hào)
private $msg = ''; //信息
private $new_name = ''; //上傳后的文件名
private $save_path = ''; //文件保存路徑
private $uploaded = ''; //路徑.文件名
private $file = ''; //等待上傳的文件
private $file_type = array(); //文件類型
private $file_ext = ''; //上傳文件的擴(kuò)展名
private $file_name = ''; //文件原名稱
private $file_size = 0; //文件大小
private $file_tmp_name = ''; //文件臨時(shí)名稱
/**
* 構(gòu)造函數(shù),初始化
* @param string $rand_name 是否隨機(jī)命名
* @param string $save_path 文件保存路徑
* @param string $allow_type 允許上傳類型
$allow_type可為數(shù)組 array('jpg', 'jpeg', 'png', 'gif');
$allow_type可為字符串 'jpg|jpeg|png|gif';中間可用' ', ',', ';', '|'分割
*/
public function __construct($rand_name=true, $save_path='./upload/', $allow_type=''){
$this->rand_name = $rand_name;
$this->save_path = $save_path;
$this->allow_type = $this->get_allow_type($allow_type);
}
/**
* 上傳文件
* 在上傳文件前要做的工作
* (1) 獲取文件所有信息
* (2) 判斷上傳文件是否合法
* (3) 設(shè)置文件存放路徑
* (4) 是否重命名
* (5) 上傳完成
* @param array $file 上傳文件
* $file須包含$file['name'], $file['size'], $file['error'], $file['tmp_name']
*/
public function upload_file($file){
//$this->file = $file;
$this->file_name = $file['name'];
$this->file_size = $file['size'];
$this->error = $file['error'];
$this->file_tmp_name = $file['tmp_name'];
$this->ext = $this->get_file_type($this->file_name);
switch($this->error){
case 0: $this->msg = ''; break;
case 1: $this->msg = '超出了php.ini中文件大小'; break;
case 2: $this->msg = '超出了MAX_FILE_SIZE的文件大小'; break;
case 3: $this->msg = '文件被部分上傳'; break;
case 4: $this->msg = '沒有文件上傳'; break;
case 5: $this->msg = '文件大小為0'; break;
default: $this->msg = '上傳失敗'; break;
}
if($this->error==0 && is_uploaded_file($this->file_tmp_name)){
//檢測文件類型
if(in_array($this->ext, $this->allow_type)==false){
$this->msg = '文件類型不正確';
return false;
}
//檢測文件大小
if($this->file_size > $this->max_size){
$this->msg = '文件過大';
return false;
}
}
$this->set_file_name();
$this->uploaded = $this->save_path.$this->new_name;
if(move_uploaded_file($this->file_tmp_name, $this->uploaded)){
$this->msg = '文件上傳成功';
return true;
}else{
$this->msg = '文件上傳失敗';
return false;
}
}
/**
* 設(shè)置上傳后的文件名
* 當(dāng)前的毫秒數(shù)和原擴(kuò)展名為新文件名
*/
public function set_file_name(){
if($this->rand_name==true){
$a = explode(' ', microtime());
$t = $a[1].($a[0]*1000000);
$this->new_name = $t.'.'.($this->ext);
}else{
$this->new_name = $this->file_name;
}
}
/**
* 獲取上傳文件類型
* @param string $filename 目標(biāo)文件
* @return string $ext 文件類型
*/
public function get_file_type($filename){
$ext = pathinfo($filename, PATHINFO_EXTENSION);
return $ext;
}
/**
* 獲取可上傳文件的類型
*/
public function get_allow_type($allow_type){
$s = array();
if(is_array($allow_type)){
foreach($allow_type as $value){
$s[] = $value;
}
}else{
$s = preg_split("/[\s,|;]+/", $allow_type);
}
return $s;
}
//獲取錯(cuò)誤信息
public function get_msg(){
return $this->msg;
}
}
?>
其實(shí)上面的代碼中還有一個(gè)可以改進(jìn)的地方,就是將那些以‘file_'開頭的變量縮寫為一個(gè)$file數(shù)組,這樣感覺更好一些。
下面我們來測試一下上面的代碼。我在一個(gè)名為upfile.php文件寫測試代碼,同時(shí)將UploadFile.class.php放在同一個(gè)路徑下。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>upfile</title>
</head>
<body>
<?php
require 'UploadFile.class.php';
if(isset($_POST['sf']) && $_POST['sf']=='sf'){
if ($_FILES["file"]["error"] > 0){
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}else{
$file = $_FILES['file'];
$upload = new UploadFile(true, './images/', array('jpg', 'jpeg', 'png'));
$upload->upload_file($file);
echo $upload->get_msg();
}
}else{
?>
<form action="" method='post' enctype="multipart/form-data">
<input type="file" name="file" id="file" />
<input type="hidden" name="sf" value="sf"/>
<input type="submit" value="上傳" name="sub" />
</form>
<?php
}
?>
</body>
</html>
在上面的代碼中,我們可以嘗試修改第15行的參數(shù),用來判斷一下我們寫的方法是否正確。
這3個(gè)參數(shù)的含義分別表示:是否使用系統(tǒng)命名、文件存放的路徑(相對)、允許上傳的文件類型。那么就試試修改這3個(gè)參數(shù)會(huì)發(fā)生什么樣的變化:(1)把true改為false是否就可以使用它原來的名字了;(2)改下存放路徑,看看能不能依然能夠上傳;(3)試試上傳幾個(gè)不允許的文件,看能不能禁止住,而且關(guān)鍵第三個(gè)參數(shù)有兩種形式,一種是數(shù)組,就像示例中一樣;還有一種是字符串,用分隔符隔開就行, 'jpg|jpeg|png|gif', 'jpg jpeg png gif', 'jpg,jpeg,png,gif'都行。
好的,文件上傳類就這樣寫好了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
php對數(shù)組內(nèi)元素進(jìn)行隨機(jī)調(diào)換的方法
這篇文章主要介紹了php對數(shù)組內(nèi)元素進(jìn)行隨機(jī)調(diào)換的方法,通過自定義函數(shù)實(shí)現(xiàn)對數(shù)組內(nèi)元素進(jìn)行隨機(jī)調(diào)換的功能,涉及php操作數(shù)組的相關(guān)技巧,需要的朋友可以參考下2015-05-05
php數(shù)組函數(shù)序列之krsort()- 對數(shù)組的元素鍵名進(jìn)行降序排序,保持索引關(guān)系
krsort() 函數(shù)將數(shù)組按照鍵逆向排序,為數(shù)組值保留原來的鍵。可選的第二個(gè)參數(shù)包含附加的排序標(biāo)志2011-11-11
PHP中輸出轉(zhuǎn)義JavaScript代碼的實(shí)現(xiàn)代碼
最近在做天地圖是GIS集成··要輸出HTML到JavaScript里面··涉及到代碼轉(zhuǎn)義什么的比較麻煩··所以寫個(gè)PHP的function2011-04-04
php使用curl獲取header檢測開啟GZip壓縮的方法
這篇文章主要介紹了php使用curl獲取header檢測開啟GZip壓縮的方法,結(jié)合實(shí)例形式總結(jié)分析了三種常見的header檢測方法并給出了使用curl檢測Gzip壓縮開啟情況的方法,需要的朋友可以參考下2018-08-08
簡單談?wù)刾hp浮點(diǎn)數(shù)精確運(yùn)算
如果用php的+-*/計(jì)算浮點(diǎn)數(shù)的時(shí)候,可能會(huì)遇到一些計(jì)算結(jié)果錯(cuò)誤的問題,所以基本上大部分語言都提供了精準(zhǔn)計(jì)算的類庫或函數(shù)庫,比如php有BC高精確度函數(shù)庫,下面我們介紹一下一些常用的BC高精確度函數(shù)使用。2016-03-03
解決File size limit exceeded 錯(cuò)誤的方法
本篇文章是對File size limit exceeded 錯(cuò)誤進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

