Maison >php教程 >php手册 >php如何生成缩略图的文件上传类(附代码)

php如何生成缩略图的文件上传类(附代码)

WBOY
WBOYoriginal
2016-06-13 09:48:201066parcourir

这篇文章主要介绍了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));         
    }         
}

【相关教程推荐】

1. php编程从入门到精通全套视频教程 

2. php从入门到精通  

3. bootstrap教程 

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Articles Liés

Voir plus