赵国亮的博客

PHP JS LINUX 高性能网站开发

导航

PHP图片上传功能 基于jquery.Jcrop.js 多图片上传 公共引用文件

demo.php演示文件:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <body >
     
    <form method="post" action="save.php" >

     
        <script>
            //上传图片功能 打开隐藏层
            function upload_pic(x){

                document.getElementById('upload_hide_'+x).style.display='block';

            }
        </script>

        上传图片:<input name="pic1" id="pic1" readonly style="background-color:#cccccc;"> <a href="javascript:upload_pic('pic1');">上传</a>
        <div id="upload_hide_pic1" style="width:360px;height:40px; border:1px solid cccccc;background:#f1f1f1;margin:5px;display:none;">
               <iframe scrolling="no" frameborder="0" src="form.php?backid=pic1" width="100%" height="30"></iframe>
         </div>

        <br>


        上传图片2:<input name="pic2" id="pic2" readonly style="background-color:#cccccc;"> <a href="javascript:upload_pic('pic2');">上传</a>
        <div id="upload_hide_pic2" style="width:360px;height:40px; border:1px solid cccccc;background:#f1f1f1;margin:5px;display:none;">
              <iframe scrolling="no" frameborder="0" src="form.php?backid=pic2" width="100%" height="30"></iframe>
         </div>

        <br>



        <input type="submit" value="确定"/> 
    
    </form>
 
 
</html>


form.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script>
	//提交验证
	function chk(){

		if(document.getElementById('file').value=='')
		{
			alert('选择图片');
			return false;
		}
	}
</script>
	</head>
   <body>
	 
    <form method="post" action="upload.php?act=upload" onsubmit="return chk();" enctype="multipart/form-data" >
	   	<input type="file" name="file" id="file">
	   	<input type="text" name="backid" value="<?php echo $_GET[backid]?>" style="display:none;">
		<input type="submit" value="开始上传"/> 
	    
    </form>
 
 </body>
</html>

  类库文件:image.class.php

<?php
class Images{
    var $inputName;                 //控件名
    var $allowType = array(
                'image/gif','image/jpg','image/jpeg','image/png','image/x-png','image/pjpeg'
    );                               //上传类型
    var $allowSize = 2097152;    //限制大小
    var $saveDir = "./uploads";      //保存目录
    var $isRename = true;               //是否重命名,默认为true
    var $errID = 0;                     //错误代码,默认为0
    var $errMsg = "";                   //错误信息
    var $savePath = "";                 //保存路径

    function __construct($inputName,$allowType="",$allowSize="",$saveDir="",$isRename=true){
        if(empty($inputName)){
            $this->chk_err(-1);       //无传入控件名
        }else{
            $this->inputName = $inputName;
        }

        if(!empty($allowType)) $this->allowType = $allowType;
        if(!empty($allowSize)) $this->allowSize = $allowSize;
        if(!empty($saveDir)) $this->saveDir = $saveDir;
        if(!empty($isRename)) $this->isRename = $isRename;
    }

    function is_uploaded(){
        if(empty($_FILES[$this->inputName]['name'])){
            $this->chk_err(4);    //没有文件被上传
        }else{
            if(is_uploaded_file($_FILES[$this->inputName]['tmp_name'])){
                return true;
            }else{
                $this->chk_err(-2);       //文件上传不合法
            }
        }
    }

    function chk_type(){
        if(!in_array($_FILES[$this->inputName]['type'],$this->allowType)){
            $this->chk_err(-3);         //上传的文件类型不被允许
        }else{
            return true;
        }
    }

    function chk_size(){
        if($_FILES[$this->inputName]['size'] > $this->allowSize){
            $this->chk_(-4);          //上传的文件过大
        }else{
            return true;
        }
    }

    function move_uploaded(){        //移动上传文件
        if(!$this->is_uploaded()){
            return false;
        }

        if(!$this->chk_size()){
            return false;
        }

        if(!$this->chk_type()){
            return false;
        }

        //重命名
        if($this->isRename){
            $arrTmp = pathinfo($_FILES[$this->inputName]['name']);
            $extension = strtolower($arrTmp['extension']);
            $file_newname = date("YmdHis").rand(1000,9999)."00.".$extension; //重命名新文件, 00表示为上传的为原图
        }else{
            $file_newname = $_FILES[$this->inputName]['name'];
        }
        
        if(!file_exists($this->saveDir)){       //判断保存目录是否存在
            mkdir($this->saveDir,0777,true);    //建立保存目录
        }

        //移动文件
        $result = move_uploaded_file($_FILES[$this->inputName]['tmp_name'],$this->saveDir."/".$file_newname);

        if($result){
            $path = $this->savePath = $this->saveDir."/".$file_newname;        //文件的成功保存路径
            return $path;
        }else{
            $this->chk_err($_FILES[$this->inputName]['error']);
        }
    
    }

    //判断出错信息
    function chk_err($errID){
        $this->errID = $errID;
        switch($this->errID){
            case -4:
                $this->errMsg = "上传的文件过大";
                break;
            case -3:
                $this->errMsg = "上传的文件类型不被允许";
                break;
            case -2:
                $this->errMsg = "文件上传不合法";
                break;
            case -1:
                $this->errMsg = "无控件名传入";
                break;
            case 1:
                $this->errMsg = '上传的文件超出了php.ini中upload_max_filesize设定的最大值';
                break;
            case 2:
                $this->errMsg = '上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值';
                break;
            case 3:
                $this->errMsg = '文件只有部分被上传';
                break;
            case 4:
                $this->errMsg = '没有文件被上传';
                break;
            default:
                break;
        }
        return false;
    
    }

    function get_errMsg(){
        echo $this->errMsg;  //输出错误信息
    }

    /**
     +----------------------------------------------------------
     * 取得图像信息
     *
     +----------------------------------------------------------
     * @static
     * @access public
     +----------------------------------------------------------
     * @param string $image 图像文件名
     +----------------------------------------------------------
     * @return mixed
     +----------------------------------------------------------
     */
    function getImageInfo($img) {
        $imageInfo = getimagesize($img);
        if( $imageInfo!== false) {
            $imageType = strtolower(substr(image_type_to_extension($imageInfo[2]),1));
            $imageSize = filesize($img);
            $info = array(
                "width"        =>$imageInfo[0],
                "height"    =>$imageInfo[1],
                "type"        =>$imageType,
                "size"        =>$imageSize,
                "mime"        =>$imageInfo['mime'],
            );
            return $info;
        }else {
            return false;
        }
    }

    /**
     +----------------------------------------------------------
     * 生成缩略图
     +----------------------------------------------------------
     * @static
     * @access public
     +----------------------------------------------------------
     * @param string $image  原图
     * @param string $type 图像格式
     * @param string $thumbname 缩略图文件名
     * @param string $maxWidth  宽度
     * @param string $maxHeight  高度
     * @param string $position 缩略图保存目录
     * @param boolean $interlace 启用隔行扫描
     * @param boolean $is_save 是否保留原图
     +----------------------------------------------------------
     * @return void
     +----------------------------------------------------------
     */
     
    function thumb($image,$is_save=true,$suofang=0,$type='',$maxWidth=500,$maxHeight=500,$interlace=true){
        // 获取原图信息
       $info  = $this->getImageInfo($image);
         if($info !== false) {
            $srcWidth  = $info['width'];
            $srcHeight = $info['height'];
            $type = empty($type)?$info['type']:$type;
            $type = strtolower($type);
            $interlace  =  $interlace? 1:0;
            unset($info);
            if ($suofang==1) {
                $width  = $srcWidth;
                $height = $srcHeight;
            } else {
                $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 计算缩放比例
                if($scale>=1) {
                    // 超过原图大小不再缩略
                    $width   =  $srcWidth;
                    $height  =  $srcHeight;
                }else{
                    // 缩略图尺寸
                    $width  = (int)($srcWidth*$scale);    //147
                    $height = (int)($srcHeight*$scale);    //199
                }
            }
            // 载入原图
            $createFun = 'ImageCreateFrom'.($type=='jpg'?'jpeg':$type);
            $srcImg     = $createFun($image);

            //创建缩略图
            if($type!='gif' && function_exists('imagecreatetruecolor'))
                $thumbImg = imagecreatetruecolor($width, $height);
            else
                $thumbImg = imagecreate($width, $height);

            // 复制图片
            if(function_exists("ImageCopyResampled"))
                imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth,$srcHeight);
            else
                imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height,  $srcWidth,$srcHeight);
            if('gif'==$type || 'png'==$type) {
                //imagealphablending($thumbImg, false);//取消默认的混色模式
                //imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息
                $background_color  =  imagecolorallocate($thumbImg,  0,255,0);  //  指派一个绿色
                imagecolortransparent($thumbImg,$background_color);  //  设置为透明色,若注释掉该行则输出绿色的图
            }
            // 对jpeg图形设置隔行扫描
            if('jpg'==$type || 'jpeg'==$type)     imageinterlace($thumbImg,$interlace);
            //$gray=ImageColorAllocate($thumbImg,255,0,0);
            //ImageString($thumbImg,2,5,5,"ThinkPHP",$gray);
            // 生成图片
            $imageFun = 'image'.($type=='jpg'?'jpeg':$type); 
            $length = strlen("00.".$type) * (-1);
            $_type = substr($image,-4);
            $length = ($type != $_type ? $length+1 : $length);
            //裁剪
            if ($suofang==1) {
                
                $thumbname01 = substr_replace($image,"01.".$type,$length);        //小图片
                $thumbname02 = substr_replace($image,"02.".$type,$length);        //中图片
 

                $imageFun($thumbImg,$thumbname01,100);
                $imageFun($thumbImg,$thumbname02,100);
     


                $thumbImg01 = imagecreatetruecolor(80,60);
                imagecopyresampled($thumbImg01,$thumbImg,0,0,$_POST['x'],$_POST['y'],80,60,$_POST['w'],$_POST['h']);

                $thumbImg02 = imagecreatetruecolor(120,90);
                imagecopyresampled($thumbImg02,$thumbImg,0,0,$_POST['x'],$_POST['y'],120,90,$_POST['w'],$_POST['h']);

 


                $imageFun($thumbImg01,$thumbname01,100);
                $imageFun($thumbImg02,$thumbname02,100);
 
                
                imagedestroy($thumbImg01);
                imagedestroy($thumbImg02);
                imagedestroy($thumbImg);
                imagedestroy($srcImg);

                return array('small' => $thumbname01 , 'middle' => $thumbname02);    //返回包含大小头像路径的数组
            }else{
                if($is_save == false){                                            //缩略图覆盖原图,缩略图的路径还是原图路径
                    $imageFun($thumbImg,$image,100);
                }else{
                    $thumbname03 = substr_replace($image,"03.".$type,$length);    //缩略图与原图同时存在,
                    $imageFun($thumbImg,$thumbname03,100);

                    imagedestroy($thumbImg);
                    imagedestroy($srcImg);
                    return $thumbname03 ;                    //返回缩略图的路径,字符串
                }
            }

         }
         return false;
    }
}
///***************
//        ----->上传到服务器上的原始图
//        ----->裁剪的大图 600*400
//        ----->裁剪的中图 86*75
//        ----->裁剪的小图 50*50
//        ----->超过规定尺寸后的缩略图

upload.php

<?php
// error_reporting(0);               //设置报错级别
date_default_timezone_set("PRC"); //设置默认时区
require_once("./image.class.php"); //引用图片上传类

$images = new Images("file");     //创建对象

    if(isset($_GET['act']) && $_GET['act'] == "upload"){
        
           $path = $images->move_uploaded();
           $images->thumb($path,false,0);    //文件比规定的尺寸大则生成缩略图,小则保持原样
        
           if($path == false){ //没有图片路径时

              //$images->get_errMsg();
?>

            <script>
                window.parent.document.getElementById("<?php echo $_POST[backid];?>").value='<?php echo "";?>';
                window.parent.document.getElementById("upload_hide_<?php echo $_POST[backid];?>").style.display='none';

            </script>

<?php
  
           }else{

               ?>


            <script>
                window.parent.document.getElementById("<?php echo $_POST[backid];?>").value='<?php echo str_replace('./','/',$path);?>';
                window.parent.document.getElementById("upload_hide_<?php echo $_POST[backid];?>").style.display='none';
            </script>


               <?php
 
             
           }
     
    }  
?>

 

posted on 2012-12-19 08:09  赵国亮的博客  阅读(417)  评论(0编辑  收藏  举报

123