PHP编程:文件上传――终结者Ⅰ
从刚开始练习的PHP基础语法练习,到PHP语言在WEB中的应用,再到实际的项目开发,如留言版,相册系统,中小型公司网站系统,以及期间做过的有关团队合作的小游戏,让我受益匪浅,学到了很多。上传|终结者 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;
//获得绝对应的巨细限制值
$ftype[]=(!empty($this->ftype[$i]))?$this->ftype[$i]:$this->ftype;
//获得绝对应的类型限制值
$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."'履行胜利 <br>";
}
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."'履行胜利 <br>";
}
}
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.'_name',$uploadname.'_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.'_name',$uploadname.'_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;
$maxsize_value=$this->format_maxsize($maxsize);//将$maxsize格局化
$thetype=(!empty($this->ftype[$i]))?$this->ftype[$i]:$this->ftype;
$ftype=array();
$lname=array();
if ($thetype!="all"){
$tmp_type=explode(",",$thetype);
for ($n=0;$n<sizeof($tmp_type);$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].")上传胜利。<br>";
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]."'删除胜利 <br>";
$i--;
}
}
//纪录和输入毛病信息
function output($msg){
if ($msg!="")$this->err=$msg;
if ($this->debug)echo "<script language=\"JavaScript\" type=\"text/JavaScript\">alert(\"".$msg."\");history.go(-1)</script>";
return false;
}
}
/*
----------------利用办法-----------------------------------------------
$obj=Lwgupload("image1","",1024*2,"all");
if ($obj->test())$obj->upload();
-------------------------------------------------------------------------
*/
?>
完成一个功能齐全的动态站点 因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax 我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 本文当是我的笔记啦,遇到的问题随时填充 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。 我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。 在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、 在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、 刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 爱上php,他也会爱上你。 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 当然这种网站的会员费就几十块钱。 其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎 说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。 对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
页:
[1]
2