表单内有两个文件域,上传图片时提示系统类库出错
表单内有两个文件域,上传图片时提示出错,注销其中任何一个,上传操作就正常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
Invalid image dimensions
supplied argument is not a valid Image resource
翻译这2句,然后找原因 jeongee 发表于 2011-9-20 09:41 static/image/common/back.gif
Invalid image dimensions
supplied argument is not a valid Image resource
我分析过以上两条错误提示,但还没能找到原因,我注销其中任何一个文件域,只使用一个文件域就正常,两个文件域同时都使用就出现错误提示…… zhaobin693 发表于 2011-9-20 10:07 static/image/common/back.gif
我分析过以上两条错误提示,但还没能找到原因,我注销其中任何一个文件域,只使用一个文件域就正常,两个 ...
发代码,发全 本帖最后由 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: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');,
生成两个不同的对象来试试。
yuzhigang5460 发表于 2011-9-20 13:34 static/image/common/back.gif
暂时没有找出毛病,但我很怀疑是你这个Img_gd2 对象状态改变了或者使其他环境改变了。最有可能就是你那个i ...
我按照你的试了下,分别在两次使用前加载img_lib,还是出现同样的错误
但还得 谢谢 你的回答 zhaobin693 发表于 2011-9-20 14:06 static/image/common/back.gif
我按照你的试了下,分别在两次使用前加载img_lib,还是出现同样的错误
但还得 谢谢 你的回答 ...
你仔细看下环境是否变化了,最好把相关的信息都var_dump一下;
我突然想到
两次$this->load->library('img_gd2');
第二次load的时候CI似乎会舍弃掉新对象的生成,因为已经存在该对象了,是不是应该unset一下。 yuzhigang5460 发表于 2011-9-20 14:31 static/image/common/back.gif
你仔细看下环境是否变化了,最好把相关的信息都var_dump一下;
我突然想到
在我上面贴出来的代码已经有了销毁的操作,你帮我看看有什么漏掉的或者是错误的…… 本帖最后由 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