檔案上傳終結者Ⅰ_PHP

來源:互聯網
上載者:User
關鍵字 上傳 檔案 if this-uploadfield
PHP代碼:--------------------------------------------------------------------------------

/*
------------------------------------------------------------------------------------
類名:Lwguploadandquery
說明:sql語句執行和檔案上傳類,是Lwgupload類的子類
作者:龍衛國
網路user:lwg888
郵箱:lwg888@163.com
使用、修改、傳播請保留作者資訊
------------------------------------------------------------------------------------
*/

require_once(dirname(__FILE__)."/Lwgdb.inc.php");//資料庫連接與查詢類
require_once(dirname(__FILE__)."/Lwgupload.inc.php");//父類
class Lwguploadandquery extends Lwgupload{
var $sql;//sql語句
var $url;//檔案上傳成功後轉向的url

//重要提示:sql語句寫法:
//$sql=sprintf("update test1 set name='%s', image1='%s', image2='%s' where id='%d'",$_POST['name'],"image1_name","image2_name",$_POST['id']);
//"image1_name","image2_name"中,image1和image2是檔案域的name或id,後面加了"_name"尾碼,便於下面找到它並修改它
function Lwguploadandquery($sql="",$uploadfield="",$url="",$uploadpath="",$maxsize="",$ftype="all"){
$this->sql=$sql;
$this->url=$url;
$this->Lwgupload($uploadfield,$uploadpath,$maxsize,$ftype);
}

function run(){
if (empty($this->sql))return $this->output("沒有可執行檔SQL語句。");

if (!is_array($this->uploadfield))$this->uploadfield=array($this->uploadfield);//如果不為數組改為數組,便於後面代碼的簡化
if (!is_array($this->maxsize))$this->maxsize=array($this->maxsize);//同上
if (!is_array($this->ftype))$this->ftype=array($this->ftype);//同上

$totaluploadfield=count($this->uploadfield);
for ($i=0;$i<$totaluploadfield;$i++){
$uploadfile=$_FILES[$this->uploadfield[$i]]['tmp_name'];
$file_name=$_FILES[$this->uploadfield[$i]]['name'];
$file_old=$_POST[$this->uploadfield[$i].'_old'];//用在更新中,表示上傳檔案所對應的原有檔案
$file_del=$_POST[$this->uploadfield[$i].'_del'];//原有檔案是否標記為刪除

if ($uploadfile!=""&&$file_name!=""){
//表示需要上傳,即檔案域裡填入了任何字元
$uploadfield[]=$this->uploadfield[$i];
//取得新的上傳欄位,因為檔案域中沒有填入任何字元的不用上傳
$maxsize[]=(!empty($this->maxsize[$i]))?$this->maxsize[$i]:$this->maxsize[0];
//取得相對應的大小限制值
$ftype[]=(!empty($this->ftype[$i]))?$this->ftype[$i]:$this->ftype[0];
//取得相對應的類型限制值
$newfile=$this->uploadpath."/".$file_name;
//上傳後的檔案地址
$insertname=$file_name;
//修改sql語言時要用到,將mysql表中對應欄位的值改為目前上傳檔案名稱
if ($file_old!="")$oldfile[]=$this->uploadpath."/".sprintf('%s',$file_old);
//用在更新中,取得原有檔案地址,當新檔案上傳後刪除舊檔案
}
else if ($file_old!=""){
//表示不需要上傳,即檔案域裡沒有填入任何字元,但是有舊檔案
if ($file_del=="true"){
//如果舊檔案標記為刪除
$insertname="";
//修改sql語言時要用到,將mysql表中對應欄位的值改為空白
$oldfile[]=$this->uploadpath."/".sprintf('%s',$file_old);
}
else $insertname=sprintf('%s',$file_old);
//既不用上傳也不用刪除,修改sql語言時要用到,將mysql表中對應欄位的值改為原檔案名稱
}
else $insertname="";
//既不用上傳也沒有原檔案,修改sql語言時要用到,將mysql表中對應欄位的值改為空白
$this->sql=str_replace($this->uploadfield[$i]."_name", $insertname, $this->sql);
//修改sql語句
}

$this->uploadfield=$uploadfield;
$this->maxsize=$maxsize;
$this->ftype=$ftype;

if (count($uploadfield)>0){
if (!$this->test($oldfile))return false;
}
//測試能否全部上傳

if (count($oldfile)>0)$this->err_del((count($oldfile)-1),$oldfile);
//通過測試後刪除標記為刪除的原檔案

$db=new Lwgdb();//資料庫連接與查詢類
if (count($uploadfield)==0){
if(!$db->query($this->sql)){
return $this->output("錯誤:NO1,提交失敗,請重試。");
//NO1表示沒有上傳檔案,且sql語句執行失敗
}
else $this->debugstr.="sql語句:'".$this->sql."'執行成功
";
}
else {
if ($this->upload()){
if(!$db->query($this->sql)){
$this->err_del(count($uploadfield)-1,$this->newfile);
//刪除上傳了的檔案
return $this->output("錯誤:NO2,提交失敗,請重試。");
//NO1表示上傳檔案後,sql語句執行失敗
}
else $this->debugstr.="sql語句:'".$this->sql."'執行成功
";
}
}
if (!empty($this->url))header("location:".$this->url);
}
}

/*
--------使用方法------------------------------------------------
$uploadname=array("image1","image2");
$sql=sprintf("update test1 set name='%s', image1='%s', image2='%s' where id='%d'",$_POST['name'],$uploadname[0].'_name',$uploadname[1].'_name',$id);
$obj=new Lwguploadandquery($sql,$uploadname,','Upload',array(40960,2048),array('jpg,gif','all'));
$obj->run();
或:
$obj=new Lwguploadandquery($sql,$uploadname,','Upload',array(40960,2048),array('jpg,gif','all'));
$obj->uploadname=array("image1","image2");
$obj->sql=sprintf("update test1 set name='%s', image1='%s', image2='%s' where id='%d'",$_POST['name'],$uploadname[0].'_name',$uploadname[1].'_name',$id);
$obj->url="http://xxxxxx.com";
$obj->uploadpath="upload/image";
$obj->maxsize=1024*5;
$obj->ftype='swf';
$obj->run();
----------------------------------------------------------------
*/
?>

--------------------------------------------------------------------------------

/*
------------------------------------------------------------------------------------
類名:Lwgupload
說明:多檔案上傳類
作者:龍衛國
網路user:lwg888
郵箱:lwg888@163.com
使用、修改、傳播請保留作者資訊
------------------------------------------------------------------------------------
*/

class Lwgupload{
//-------------可以設定值的變數------------------------
var $uploadfield;//上傳檔案的欄位名
var $maxsize;//限制上傳檔案的大小
var $file_old;//需要刪除的舊檔案
var $uploadpath;//檔案的上傳路徑
var $ftype;//限制上傳檔案的類型
var $debug=true;//是否顯示調試或錯誤資訊

//------------用來擷取值的變數---------------------------
var $uploadfile;//上傳後的臨時檔案
var $file_name;//檔案名稱
var $file_size;//檔案的大小
var $file_size_format;//格式化後的$file_size
var $file_type;//檔案類型
var $debugstr="";//記錄調試資訊
var $err="";//記錄錯誤資訊

//建構函式
//$uploadfield 上傳檔案的欄位名,上傳多個檔案時可以是數組
//$uploadpath 檔案的上傳路徑,不能為數組
//$maxsize 限制上傳檔案的大小,上傳多個檔案時可以是數組,為不同的檔案限制不同大小
//$ftype 限制上傳檔案的類型,上傳多個檔案時可以是數組,為不同的檔案限制不同類型
//$ftype 為‘all’時為不限制類型
//使用時可以將$ftype的值設為array('jpg,gif,png','swf','all')表示為三個上傳檔案限制類型。第一個檔案必須是jpg或gif或png,第二個必須是swf,第三個為任意類型
function Lwgupload($uploadfield="",$uploadpath="",$maxsize="",$ftype="all"){
$this->uploadfield=$uploadfield;
$this->uploadpath=$uploadpath;
$this->maxsize=$maxsize;
$this->ftype=$ftype;
}

//test()用來測試能否全部上傳,否則一個也不要上傳
//$oldfile表示要刪除的檔案,用在更新中,刪除舊的上傳新的
function test($oldfile='){
if ($this->uploadfield=="")return;
if (empty($this->uploadpath))$this->uploadpath=dirname($_SERVER['PATH_TRANSLATED'])."/Upload";
if (empty($this->maxsize))$this->maxsize=1048576;
if (!is_array($this->uploadfield))$this->uploadfield=array($this->uploadfield);
//如果不為數組改為數組,便於後面代碼的簡化
$total_upload=count($this->uploadfield);//獲得總欄位數

if (!is_array($this->maxsize))$this->maxsize=array($this->maxsize);//如果不為數組改為數組,便於後面代碼的簡化
if (!is_array($this->ftype))$this->ftype=array($this->ftype);//同上

//如果沒有相應路徑則建立之
if (!file_exists($this->uploadpath)){
if (!mkdir($this->uploadpath,0700))return output("錯誤!請手動建立有效路徑。");
}

include_once(dirname(__FILE__)."/Lwgfiletype.inc.php");
//該檔案包含了陣列變數$filetype,記錄大多數檔案類型對應的副檔名

Set_time_limit(60);//設定逾時為60秒

$needupload=array();//經測試可以上傳的檔案

for ($i=0;$i<$total_upload;$i++){
$this->uploadfile[$i]=$_FILES[$this->uploadfield[$i]]['tmp_name']; //臨時檔案
$this->file_name[$i]=$_FILES[$this->uploadfield[$i]]['name']; //檔案名稱
$this->file_type[$i]=$_FILES[$this->uploadfield[$i]]['type']; //類型
$this->file_lname[$i]=strtolower(substr( strrchr($this->file_name[$i], "." ), 1 )); //副檔名
$this->file_size[$i]=$_FILES[$this->uploadfield[$i]]['size']; //大小
$this->file_old[$i]=$_POST[$this->uploadfield[$i].'_old']; //需要刪除的檔案
$this->newfile[$i]=$this->uploadpath."/".$this->file_name[$i];//上傳後的地址

$maxsize=(!empty($this->maxsize[$i]) && $this->maxsize[$i]>0)?$this->maxsize[$i]:$this->maxsize[0];

$maxsize_value=$this->format_maxsize($maxsize);//將$maxsize格式化

$thetype=(!empty($this->ftype[$i]))?$this->ftype[$i]:$this->ftype[0];
$ftype=array();
$lname=array();
if ($thetype!="all"){
$tmp_type=explode(",",$thetype);
for ($n=0;$n $tmp_t=trim($tmp_type[$n]);
if (!empty($tmp_t)){
$s_tmp=strtolower($tmp_t);
$ftype[]=$filetype[$s_tmp];
$lname[]=$s_tmp;
}
}
}
//分析限制當前類型的參數

if (($this->file_size[$i]==0)||($this->uploadfile[$i]=="")){
return $this->output($this->uploadfield[$i]."上傳了無效檔案或0位元組檔案。");
}

if ($thetype!="all" && !in_array($this->file_type[$i],$ftype) && !in_array($this->file_lname[$i],$lname)){
return $this->output("對不起!上傳檔案格式只能是'".$thetype."'。");
}

if ($this->file_size[$i] > $maxsize){
return $this->output("對不起!檔案'".$this->file_name[$i]."'大於'".$maxsize_Value."',上傳失敗。\n請減小檔案到".$maxsize_Value."之內,然後再試。");
}

if (file_exists($this->newfile[$i])){
if ($oldfile=="" || ($oldfile!="" && !in_array($this->newfile[$i],$oldfile)))return $this->output("對不起!檔案'".$this->file_name[$i]."'已經存在,上傳失敗。請變更檔名,然後再試。");
//$oldfile表示要刪除的檔案,雖然要上傳的檔案存在,但它將要被刪除,因此還是可以上傳
}

if (in_array($this->file_name[$i],$needupload)){
//如果兩個以上的上傳欄位上傳相同的檔案是不允許的
return $this->output("對不起!檔案'".$this->file_name[$i]."'重複,上傳失敗。請變更檔名,然後再試。");
}
$needupload[]=$this->file_name[$i];
}
Set_time_limit(30);//設定逾時為30秒
return true;
}


//測試過關後可以上傳
function upload(){
if ($this->uploadfield=="")return false;
$total_upload=count($this->uploadfield);

for ($i=0;$i<$total_upload;$i++){
$this->file_size_format[$i]=$this->format_maxsize($this->file_size[$i]);

if (@move_uploaded_file($this->uploadfile[$i],$this->newfile[$i]))
$this->debugstr.="檔案'".$this->file_name[$i]."'(".$this->file_size_format[$i].")上傳成功。
";
else {
if ($i>0)$this->err_del(($i-1),$this->newfile);
//如果有一個上傳失敗,則刪除所有已上傳的檔案
return $this->output("對不起!檔案'".$this->file_name[$i]."'上傳失敗。請重試。");
}
}
return true;
}

//格式檔案大小數字
function format_maxsize($value){
if ($value<1024)$maxsize_Value = $value."位元組";
elseif ($value<1024*1024)$maxsize_Value = number_format((double)($value/1024),2)."kb";
else $maxsize_Value = number_format((double)($value/(1024*1024)),2)."mb";
return $maxsize_Value;
}

//出錯後刪除已上傳的檔案
function err_del($i,$thefile){
while ($i>=0){
if (@unlink($thefile[$i])!=false)$this->debugstr.="檔案'".$thefile[$i]."'刪除成功
";
$i--;
}
}

//記錄和輸出錯誤資訊
function output($msg){
if ($msg!="")$this->err=$msg;
if ($this->debug)echo "";
return false;
}
}

/*
----------------使用方法-----------------------------------------------
$obj=Lwgupload("image1","",1024*2,"all");
if ($obj->test())$obj->upload();
-------------------------------------------------------------------------
*/
?>
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.