之前使用后台实现单个产品添加的时候是一张表单,里面包含产品名称域,图片上传域,产品介绍域,是否推荐等,点击添加后直接插入数据库,前台显示的时候也是直接读取产品文件夹里的原图,这样打开页面非常慢。最近想弄一个后台批量添加产品的功能,现在我通过一个FLASH控件将图片批量上传到了一个文件夹(product_yuantu),我想读取这个文件夹的图片并且将它们生成缩略图放到另一个文件夹(product_suolue)。还有,我构想的是,生成缩略图后,就把缩略图的名字和原图的名字一起存到数据库里(方便删除修改),然后在前台通过<img src="product_suolue/".$rs->fields["imgname"]的方式显示缩略图片,点击缩略图片后显示大图片(通过控制后的原图,比如<img src="product_yuantu".$rs->fields["bigimgname"] width="400" height="400">).但是我觉得这样的方法很笨,不知道还有什么更好的办法
上面说得有点乱,简单说就是要实现   批量上传(已实现。已经把图片上传到了product_yuantu文件夹里)--->生成缩略图(未实现。读取product_yuantu文件夹里的图片并生成缩略图放到另一个文件夹product_suolue)---->存入数据库(不知道是否可行或是还有更好的办法。)有哪位大哥能帮下小弟解决一下生成缩略图的功能,网上找到的都是上传时候直接生成的,我上传的时候是通过插件直接上传到了文件夹里。还有,大家对于后台添加产品这类功能更好的实现方法和思路是什么,能给我讲讲么?(可不可以实现像QQ空间批量上传相片那种功能,就是上传图片后,直接跳转到编辑页面,输入描述后提交就能显示)
小弟才学习PHP不久,是个超级菜鸟,希望大家能帮帮忙,万分感谢

解决方案 »

  1.   


    上传的时候,如果是单个图片的话,我已经实现了,现在是我用的是FLASH控件上传,传到了一个文件夹里面,我想读取这个文件夹的图片,然后生成缩略图到另外一个文件夹。打开页面的时候动态生成?是不是显示的时候控制图片的大小?
      

  2.   


    不是控制img的width;而是用你實現的单个图片縮圖的方法,動態生成一張縮略圖。
      

  3.   

    一般生成缩略图都是在上传成功的时候。至于你说的那个产品添加,我觉得一般都是单个产品图片上传吧? 如果要批量上传的话,可以在上传图片时直接在数据库里为这张图片所代表的产品申请个位置(就是插入条数据,介绍什么的都为空,只有产品图片那里填入数据)
    然后制作个后台的产品信息编辑器,使用ajax载入,保存,自动(判断是否存在缩略图,不存在就生成)或手动生成缩略图。如果怕上传的图片还没有添加产品信息就被别人看到,可以给产品加个表示是否展示的字段(例如,is_display字段,为0时不展示,为1展示,默认为0,上传后的图片只要没被允许时就不会被展示了),后台编辑时再手动允许展示。关于缩略图的代码,这个是我在ThinkPHP的扩展包里找到的
       /**
         +----------------------------------------------------------
         * 生成缩略图
         +----------------------------------------------------------
         * @static
         * @access public
         +----------------------------------------------------------
         * @param string $image  原图
         * @param string $type 图像格式
         * @param string $thumbname 缩略图文件名
         * @param string $maxWidth  宽度
         * @param string $maxHeight  高度
         * @param string $position 缩略图保存目录
         * @param boolean $interlace 启用隔行扫描
         +----------------------------------------------------------
         * @return void
         +----------------------------------------------------------
         */
        static function thumb($image,$thumbname,$type='',$maxWidth=200,$maxHeight=50,$interlace=true)
        {
            // 获取原图信息
            $info  = Image::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);
                $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 计算缩放比例
                if($scale>=1) {
                    // 超过原图大小不再缩略
                    $width   =  $srcWidth;
                    $height  =  $srcHeight;
                }else{
                    // 缩略图尺寸
                    $width  = (int)($srcWidth*$scale);
                    $height = (int)($srcHeight*$scale);
                }            // 载入原图
                $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);
                $imageFun($thumbImg,$thumbname);
                imagedestroy($thumbImg);
                imagedestroy($srcImg);
                return $thumbname;
             }
             return false;
        }里面有个用到 获取图像信息 的函数  Image::getImageInfo
        /**
         +----------------------------------------------------------
         * 取得图像信息
         *
         +----------------------------------------------------------
         * @static
         * @access public
         +----------------------------------------------------------
         * @param string $image 图像文件名
         +----------------------------------------------------------
         * @return mixed
         +----------------------------------------------------------
         */
        static 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;
            }
        }