php图片上传可生成缩略图的类实例

WBOY
풀어 주다: 2016-06-20 13:02:01
원래의
863명이 탐색했습니다.

这篇文章主要介绍了php可生成缩略图的文件上传类,给出了完整的类文件代码及其相应的用法示例,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了php可生成缩略图的文件上传类及其用法。分享给大家供大家参考。具体实现方法如下:

类文件调用方法如下:

<?php 

if ($_GET[&#39;action&#39;] == &#39;save&#39;) {         

    $up = new upload();         

    $up->set_dir(dirname(__FILE__).&#39;/upload/&#39;,&#39;{y}/{m}&#39;);         

    $up->set_thumb(100,80);         

    $up->set_watermark(dirname(__FILE__).&#39;/jblog/images/watermark.png&#39;,6,90);         

    $fs = $up->execute();         

    var_dump($fs);         

}      

?> 

<html>         

    <head><title>test</title></head>         

    <body style="margin:0;padding:0">         

    <form name="upload" method="post" action="?action=save" enctype="multipart/form-data" style="margin:0">         

        <input type="file" name="attach[]" />         

        <input type="file" name="attach[]" />         

        <input type="submit" name="submit" value="上 传" />         

    </form>         

    </body>         

</html>
로그인 후 복사

upload上传类文件如下:

class upload {

    var $dir;            //附件存放物理目录         

    var $time;           //自定义文件上传时间         

    var $allow_types;    //允许上传附件类型         

    var $field;          //上传控件名称         

    var $maxsize;        //最大允许文件大小,单位为KB         

    var $thumb_width;    //缩略图宽度         

    var $thumb_height;   //缩略图高度         

    var $watermark_file; //水印图片地址         

    var $watermark_pos;  //水印位置         

    var $watermark_trans;//水印透明度         

    //构造函数         

    //$types : 允许上传的文件类型 , $maxsize : 允许大小 ,  $field : 上传控件名称 , $time : 自定义上传时间         

    function upload($types = &#39;jpg|png&#39;, $maxsize = 1024, $field = &#39;attach&#39;, $time = &#39;&#39;) {         

        $this->allow_types = explode(&#39;|&#39;,$types);         

        $this->maxsize = $maxsize * 1024;         

        $this->field = $field;         

        $this->time = $time ? $time : time();         

    }         

    //设置并创建文件具体存放的目录         

    //$basedir  : 基目录,必须为物理路径         

    //$filedir  : 自定义子目录,可用参数{y}、{m}、{d}         

    function set_dir($basedir,$filedir = &#39;&#39;) {         

        $dir = $basedir;         

        !is_dir($dir) && @mkdir($dir,0777);         

        if (!emptyempty($filedir)) {         

            $filedir = str_replace(array(&#39;{y}&#39;,&#39;{m}&#39;,&#39;{d}&#39;),array(date(&#39;Y&#39;,$this->time),date(&#39;m&#39;,$this->time),date(&#39;d&#39;,$this->time)),strtolower($filedir));         

            $dirs = explode(&#39;/&#39;,$filedir);         

            foreach ($dirs as $d) {         

                !emptyempty($d) && $dir .= $d.&#39;/&#39;;         

                !is_dir($dir) && @mkdir($dir,0777);         

            }         

        }         

        $this->dir = $dir;         

    }         

    //图片缩略图设置,如果不生成缩略图则不用设置         

    //$width : 缩略图宽度 , $height : 缩略图高度         

    function set_thumb ($width = 0, $height = 0) {         

        $this->thumb_width  = $width;         

        $this->thumb_height = $height;         

    }         

    //图片水印设置,如果不生成添加水印则不用设置         

    //$file : 水印图片 , $pos : 水印位置 , $trans : 水印透明度         

    function set_watermark ($file, $pos = 6, $trans = 80) {         

        $this->watermark_file  = $file;         

        $this->watermark_pos   = $pos;         

        $this->watermark_trans = $trans;         

    }         

    /*----------------------------------------------------------------       

    执行文件上传,处理完返回一个包含上传成功或失败的文件信息数组,       

    其中:name 为文件名,上传成功时是上传到服务器上的文件名,上传失败则是本地的文件名       

          dir  为服务器上存放该附件的物理路径,上传失败不存在该值       

          size 为附件大小,上传失败不存在该值       

          flag 为状态标识,1表示成功,-1表示文件类型不允许,-2表示文件大小超出       

    -----------------------------------------------------------------*/        

    function execute() {         

        $files = array(); //成功上传的文件信息         

        $field = $this->field;         

        $keys = array_keys($_FILES[$field][&#39;name&#39;]);         

        foreach ($keys as $key) {         

            if (!$_FILES[$field][&#39;name&#39;][$key]) continue;         

            $fileext = $this->fileext($_FILES[$field][&#39;name&#39;][$key]); //获取文件扩展名         

            $filename = date(&#39;Ymdhis&#39;,$this->time).mt_rand(10,99).&#39;.&#39;.$fileext; //生成文件名         

            $filedir = $this->dir;  //附件实际存放目录         

            $filesize = $_FILES[$field][&#39;size&#39;][$key]; //文件大小

            //文件类型不允许         

            if (!in_array($fileext,$this->allow_types)) {         

                $files[$key][&#39;name&#39;] = $_FILES[$field][&#39;name&#39;][$key];         

                $files[$key][&#39;flag&#39;] = -1;         

                continue;         

            }         

            //文件大小超出         

            if ($filesize > $this->maxsize) {         

                $files[$key][&#39;name&#39;] = $_FILES[$field][&#39;name&#39;][$key];         

                $files[$key][&#39;name&#39;] = $filesize;         

                $files[$key][&#39;flag&#39;] = -2;         

                continue;         

            }         

            $files[$key][&#39;name&#39;] = $filename;         

            $files[$key][&#39;dir&#39;] = $filedir;         

            $files[$key][&#39;size&#39;] = $filesize;         

            //保存上传文件并删除临时文件         

            if (is_uploaded_file($_FILES[$field][&#39;tmp_name&#39;][$key])) {         

                move_uploaded_file($_FILES[$field][&#39;tmp_name&#39;][$key],$filedir.$filename);         

                @unlink($_FILES[$field][&#39;tmp_name&#39;][$key]);         

                $files[$key][&#39;flag&#39;] = 1;         

                //对图片进行加水印和生成缩略图         

                if (in_array($fileext,array(&#39;jpg&#39;,&#39;png&#39;))) {         

                    if ($this->thumb_width) {         

                        if ($this->create_thumb($filedir.$filename,$filedir.&#39;thumb_&#39;.$filename)) {         

                            $files[$key][&#39;thumb&#39;] = &#39;thumb_&#39;.$filename;  //缩略图文件名         

                        }         

                    }         

                    $this->create_watermark($filedir.$filename);         

                }         

            }         

        }         

        return $files;         

    }         

    //创建缩略图,以相同的扩展名生成缩略图         

    //$src_file : 来源图像路径 , $thumb_file : 缩略图路径         

    function create_thumb ($src_file,$thumb_file) {         

        $t_width  = $this->thumb_width;         

        $t_height = $this->thumb_height;         

        if (!file_exists($src_file)) return false;         

        $src_info = getImageSize($src_file);         

        //如果来源图像小于或等于缩略图则拷贝源图像作为缩略图         

        if ($src_info[0] <= $t_width && $src_info[1] <= $t_height) {         

            if (!copy($src_file,$thumb_file)) {         

                return false;         

            }         

            return true;         

        }         

        //按比例计算缩略图大小         

        if ($src_info[0] - $t_width > $src_info[1] - $t_height) {         

            $t_height = ($t_width / $src_info[0]) * $src_info[1];         

        } else {         

            $t_width = ($t_height / $src_info[1]) * $src_info[0];         

        }         

        //取得文件扩展名         

        $fileext = $this->fileext($src_file);         

        switch ($fileext) {         

            case &#39;jpg&#39; :         

                $src_img = ImageCreateFromJPEG($src_file); break;         

            case &#39;png&#39; :         

                $src_img = ImageCreateFromPNG($src_file); break;         

            case &#39;gif&#39; :         

                $src_img = ImageCreateFromGIF($src_file); break;         

        }         

        //创建一个真彩色的缩略图像         

        $thumb_img = @ImageCreateTrueColor($t_width,$t_height);         

        //ImageCopyResampled函数拷贝的图像平滑度较好,优先考虑         

        if (function_exists(&#39;imagecopyresampled&#39;)) {         

            @ImageCopyResampled($thumb_img,$src_img,0,0,0,0,$t_width,$t_height,$src_info[0],$src_info[1]);         

        } else {         

            @ImageCopyResized($thumb_img,$src_img,0,0,0,0,$t_width,$t_height,$src_info[0],$src_info[1]);         

        }         

        //生成缩略图         

        switch ($fileext) {         

            case &#39;jpg&#39; :         

                ImageJPEG($thumb_img,$thumb_file); break;         

            case &#39;gif&#39; :         

                ImageGIF($thumb_img,$thumb_file); break;         

            case &#39;png&#39; :         

                ImagePNG($thumb_img,$thumb_file); break;         

        }         

        //销毁临时图像         

        @ImageDestroy($src_img);         

        @ImageDestroy($thumb_img);         

        return true;         

    }         

    //为图片添加水印         

    //$file : 要添加水印的文件         

    function create_watermark ($file) {         

        //文件不存在则返回         

        if (!file_exists($this->watermark_file) || !file_exists($file)) return;         

        if (!function_exists(&#39;getImageSize&#39;)) return;         

        //检查GD支持的文件类型         

        $gd_allow_types = array();         

        if (function_exists(&#39;ImageCreateFromGIF&#39;)) $gd_allow_types[&#39;image/gif&#39;] = &#39;ImageCreateFromGIF&#39;;         

        if (function_exists(&#39;ImageCreateFromPNG&#39;)) $gd_allow_types[&#39;image/png&#39;] = &#39;ImageCreateFromPNG&#39;;         

        if (function_exists(&#39;ImageCreateFromJPEG&#39;)) $gd_allow_types[&#39;image/jpeg&#39;] = &#39;ImageCreateFromJPEG&#39;;         

        //获取文件信息         

        $fileinfo = getImageSize($file);         

        $wminfo   = getImageSize($this->watermark_file);         

        if ($fileinfo[0] < $wminfo[0] || $fileinfo[1] < $wminfo[1]) return;         

        if (array_key_exists($fileinfo[&#39;mime&#39;],$gd_allow_types)) {         

            if (array_key_exists($wminfo[&#39;mime&#39;],$gd_allow_types)) {         

                //从文件创建图像         

                $temp = $gd_allow_types[$fileinfo[&#39;mime&#39;]]($file);         

                $temp_wm = $gd_allow_types[$wminfo[&#39;mime&#39;]]($this->watermark_file);         

                //水印位置         

                switch ($this->watermark_pos) {                      

                    case 1 :  //顶部居左         

                        $dst_x = 0; $dst_y = 0; break;                       

                    case 2 :  //顶部居中         

                        $dst_x = ($fileinfo[0] - $wminfo[0]) / 2; $dst_y = 0; break;                         

                    case 3 :  //顶部居右         

                        $dst_x = $fileinfo[0]; $dst_y = 0; break;                        

                    case 4 :  //底部居左         

                        $dst_x = 0; $dst_y = $fileinfo[1]; break;                        

                    case 5 :  //底部居中         

                        $dst_x = ($fileinfo[0] - $wminfo[0]) / 2; $dst_y = $fileinfo[1]; break;              

                    case 6 :  //底部居右         

                        $dst_x = $fileinfo[0]-$wminfo[0]; $dst_y = $fileinfo[1]-$wminfo[1]; break;         

                    default : //随机         

                        $dst_x = mt_rand(0,$fileinfo[0]-$wminfo[0]); $dst_y = mt_rand(0,$fileinfo[1]-$wminfo[1]);         

                }         

                if (function_exists(&#39;ImageAlphaBlending&#39;)) ImageAlphaBlending($temp_wm,True); //设定图像的混色模式         

                if (function_exists(&#39;ImageSaveAlpha&#39;)) ImageSaveAlpha($temp_wm,True); //保存完整的 alpha 通道信息         

                //为图像添加水印         

                if (function_exists(&#39;imageCopyMerge&#39;)) {         

                    ImageCopyMerge($temp,$temp_wm,$dst_x,$dst_y,0,0,$wminfo[0],$wminfo[1],$this->watermark_trans);         

                } else {         

                    ImageCopyMerge($temp,$temp_wm,$dst_x,$dst_y,0,0,$wminfo[0],$wminfo[1]);         

                }         

                //保存图片         

                switch ($fileinfo[&#39;mime&#39;]) {         

                    case &#39;image/jpeg&#39; :         

                        @imageJPEG($temp,$file);         

                        break;         

                    case &#39;image/png&#39; :         

                        @imagePNG($temp,$file);         

                        break;         

                    case &#39;image/gif&#39; :          

                        @imageGIF($temp,$file);         

                        break;         

                }         

                //销毁零时图像         

                @imageDestroy($temp);         

                @imageDestroy($temp_wm);         

            }         

        }         

    }         

    //获取文件扩展名         

    function fileext($filename) {         

        return strtolower(substr(strrchr($filename,&#39;.&#39;),1,10));         

    }         

}
로그인 후 복사

希望本文所述对大家的PHP程序设计有所帮助。


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿