zhaobin693 发表于 2011-9-20 08:59:11

表单内有两个文件域,上传图片时提示系统类库出错

表单内有两个文件域,上传图片时提示出错,注销其中任何一个,上传操作就正常
A PHP Error was encountered
Severity: Warning

Message: imagecreatetruecolor() : Invalid image dimensions

Filename: libraries/Image_lib.php

Line Number: 514



A PHP Error was encountered
Severity: Warning

Message: imagecopyresampled(): supplied argument is not a valid Image resource

Filename: libraries/Image_lib.php

Line Number: 522

jeongee 发表于 2011-9-20 09:41:15

Invalid image dimensions

supplied argument is not a valid Image resource

翻译这2句,然后找原因

zhaobin693 发表于 2011-9-20 10:07:46

jeongee 发表于 2011-9-20 09:41 static/image/common/back.gif
Invalid image dimensions

supplied argument is not a valid Image resource


我分析过以上两条错误提示,但还没能找到原因,我注销其中任何一个文件域,只使用一个文件域就正常,两个文件域同时都使用就出现错误提示……

jeongee 发表于 2011-9-20 10:12:04

zhaobin693 发表于 2011-9-20 10:07 static/image/common/back.gif
我分析过以上两条错误提示,但还没能找到原因,我注销其中任何一个文件域,只使用一个文件域就正常,两个 ...

发代码,发全

zhaobin693 发表于 2011-9-20 10:39:42

本帖最后由 zhaobin693 于 2011-9-20 10:40 编辑

jeongee 发表于 2011-9-20 10:12 http://codeigniter.org.cn/forums/static/image/common/back.gif
发代码,发全define("IDCARDWIDTH","800");//用户身份证复印件限制宽度
define("IDCARDHEIGHT","650");//用户身份证复印件限制高度
define("IDCARDTHUMBW","280");//用户身份证复印件缩略图宽度
define("IDCARDTHUMBH","190");//用户身份证复印将缩略图高度
define("ZSWIDTH","600");//学历证书图片宽度
define("ZSHEIGHT","1000");//学历证书图片高度
define("ZSTHUMBW","200");//学历证书缩略图宽度
define("ZSTHUMBH","300");//学历证书缩略图高度


控制器
//身份证复印件
                $idcard_path_img=$this->path_img."/idcard";
                $idcard_img=$this->input->post("idcardCopy");
                $cardname=$gonghao."_"."idcard";
                $updidcardimgvfy=$this->img_gd2->imgresize($idcard_path_img,$cardname,"idcardCopy",IDCARDWIDTH,IDCARDHEIGHT,$idcard_img);
                        if (!$updidcardimgvfy){
                              $data["logicstr"]="身份证复印件图片没有上传成功,只支持png,gif,jpg,不能超过1M";
                              return $data;
                        }else {
                              if ($updidcardimgvfy!="nofile"){
                                        $idcard_img_name=$updidcardimgvfy;
                                        $this->img_gd2->imgthumb($idcard_path_img,$updidcardimgvfy,IDCARDTHUMBW,IDCARDTHUMBH);
                              }
                        }
//学历证书复印件
                $zsh_path_img=$this->path_img."/zhengshu";
                $zsh_img=$this->input->post("certificateCopy");
                $zshname=$gonghao."_"."zhengshu";
                $updzshimgvfy=$this->img_gd2->imgresize($zsh_path_img,$zshname,"certificateCopy",ZSWIDTH,ZSHEIGHT,$zsh_img);
                        if(!$updzshimgvfy){
                              $data["logicstr"]="学历证书复印件图片没有上传成功,只支持png,gif,jpg,不能超过1M";
                              return $data;
                        }else {
                              if ($updzshimgvfy!="nofile"){
                                        $zsh_img_name=$updzshimgvfy;
                                        $this->img_gd2->imgthumb($zsh_path_img,$updzshimgvfy,ZSTHUMBW,ZSTHUMBH);
                              }
                        }
自定义上传的类
<?php
class Img_gd2 extends CI_Model{
      function __construct(){
                parent::__construct();
      }
      //获取图片大小
      public function getimg($path_img) {
                return @getimagesize($path_img);
      }
      
      //图片上传压缩
      public function imgresize($path_img,$frontname,$fileyu,$xzwidth,$xzheight,$img0=null){               
                if(!is_dir($path_img)){@mkdir($path_img);}//如果路径不存在就创建一个目录
                $cfg['upload_path'] = "{$path_img}/";   //上传后存放的路径
                $cfg['allowed_types'] = 'gif|jpg|png';    //允许上传的文件格式
                $cfg['max_size'] = '1024';                //允许上传文件的大小
                $cfg['encrypt_name'] = TRUE;
                $this->load->library('upload',$cfg);
                $uploadvfy=$this->upload->do_upload($fileyu); //do_upload函数中的参数是上传的文件的表单里文件域名
                if($uploadvfy){
                        if($img0){@unlink($path_img."/".$img0);}//删除旧的图片
                        $arrimg_data=$this->upload->data(); //这是一个辅助函数,它返回你上传文件的所有相关信息的数组。
                        $refilename="{$frontname}".strtolower($arrimg_data["file_ext"]);
                        @rename("{$path_img}/{$arrimg_data["file_name"]}","{$path_img}/{$refilename}");
                        $arrwh=$this->getimg("{$path_img}/{$refilename}");      //这个应该是获取图片的尺寸
                        $width0=$arrwh;
                        $height0=$arrwh;
                        if($width0>$xzwidth){
                              $height0=($xzwidth/$width0)*$height0;
                              $width0=$xzwidth;
                        }
                        if($height0>$xzheight){
                              $width0=($xzheight/$height0)*$width0;
                              $height0=$xzheight;
                        }
                        $config['image_library'] = 'gd2';
                        $config['source_image'] = "{$path_img}/{$refilename}";
                        $config['quality'] = '80%';
                        $config['width'] = $width0;
                        $config['height'] = $height0;
                        $this->load->library('image_lib');
                        $this->image_lib->initialize($config);
                        $this->image_lib->resize();
                        unset($this->image_lib);            //销毁指定的变量
                        unset($this->upload);
                        unset($cfg);
                        unset($config);
                        return $refilename;
                }
                if($this->upload->display_error())   //如果上传失败,则显示错误提示信息并返回空值
                {
                        return null;
                }
                return "nofile";
      }
      
      //生成缩略图
      public function imgthumb($path_img,$img_name,$xzwidth,$xzheight,$img0=null){
                @unlink("$path_img/thumb_$img0");
                $arrwh=$this->getimg("{$path_img}/{$img_name}");
                $width0=$arrwh;
                $height0=$arrwh;
                if($width0>$xzwidth){
                        $height0=($xzwidth/$width0)*$height0;
                        $width0=$xzwidth;
                }
                if($height0>$xzheight){
                        $width0=($xzheight/$height0)*$width0;
                        $height0=$xzheight;
                }
                $config['image_library'] = 'gd2';
                $config['source_image'] = "{$path_img}/{$img_name}";
                $config['new_image']="{$path_img}/thumb_{$img_name}";               
                $config['quality'] = '80%';
                $config['width'] = $width0;
                $config['height'] = $height0;
                $this->load->library('image_lib');
                $this->image_lib->initialize($config);
                $this->image_lib->resize();
                unset($config);
      }
}

yuzhigang5460 发表于 2011-9-20 13:34:57

本帖最后由 yuzhigang5460 于 2011-9-20 13:39 编辑

zhaobin693 发表于 2011-9-20 10:39 static/image/common/back.gif
控制器

自定义上传的类
暂时没有找出毛病,但我很怀疑是你这个Img_gd2 对象状态改变了或者使其他环境改变了。最有可能就是你那个img_lib;

你使用
$updidcardimgvfy=$this->img_gd2->imgresize()……
之前使用一次$this->load->library('img_gd2');

然后再$updzshimgvfy=$this->img_gd2->imgresize()……
之前再使用一次$this->load->library('img_gd2');,
生成两个不同的对象来试试。

zhaobin693 发表于 2011-9-20 14:06:37

yuzhigang5460 发表于 2011-9-20 13:34 static/image/common/back.gif
暂时没有找出毛病,但我很怀疑是你这个Img_gd2 对象状态改变了或者使其他环境改变了。最有可能就是你那个i ...

我按照你的试了下,分别在两次使用前加载img_lib,还是出现同样的错误
但还得 谢谢 你的回答

yuzhigang5460 发表于 2011-9-20 14:31:23

zhaobin693 发表于 2011-9-20 14:06 static/image/common/back.gif
我按照你的试了下,分别在两次使用前加载img_lib,还是出现同样的错误
但还得 谢谢 你的回答 ...

你仔细看下环境是否变化了,最好把相关的信息都var_dump一下;

我突然想到
两次$this->load->library('img_gd2');
第二次load的时候CI似乎会舍弃掉新对象的生成,因为已经存在该对象了,是不是应该unset一下。

zhaobin693 发表于 2011-9-20 14:39:23

yuzhigang5460 发表于 2011-9-20 14:31 static/image/common/back.gif
你仔细看下环境是否变化了,最好把相关的信息都var_dump一下;

我突然想到


在我上面贴出来的代码已经有了销毁的操作,你帮我看看有什么漏掉的或者是错误的……

yuzhigang5460 发表于 2011-9-20 16:51:32

本帖最后由 yuzhigang5460 于 2011-9-20 16:52 编辑

zhaobin693 发表于 2011-9-20 14:39 static/image/common/back.gif
在我上面贴出来的代码已经有了销毁的操作,你帮我看看有什么漏掉的或者是错误的…… ...
你的错误就在于此:
      unset($this->image_lib);      
这样做是有很大问题的;

请各位使用这种方法销毁CI下的library属性的同学注意了。

仔细查看源代码你会发现,core/Loader.php下的第807行
if (in_array($filepath, $this->_ci_loaded_files)){}
实际上你的确销毁了这个对象,但当你再次使用$this->load->library('image_lib');时就遇到问题了,
因为原则上CI只是检查$this->_ci_loaded_files里是否已经填写了这个文件,很不幸,第二次载入时CI发现_ci_loaded_files有这个文件名,但实际上已经被你unset了,名存实亡,相当于花名册上有这个人,但这个人其实已经歇菜了。

以上只在一个控制器里的一个方法里是有效的,如果换了方法相当于重新生成了CI对象,所以不会出现这个问题;

而你刚好是在一个方法里,出现了这个问题i。
页: [1] 2
查看完整版本: 表单内有两个文件域,上传图片时提示系统类库出错