dongquelu1239 2012-10-31 09:27
浏览 72
已采纳

在CodeIgniter PHP中上传之前调整图像大小

I am having the following block of code in my function:

$target_path = "uploads/";

        $target_path = $target_path . basename( $_FILES['image']['name']);

        if(move_uploaded_file($_FILES['image']['tmp_name'], $target_path))
       {
             echo  "The file ".  basename( $_FILES['image']['name'])." has been uploaded";           
       }      
       else   
       {
            echo "There was an error uploading the file, please try again!";
       }

Now I want to resize the image before uploading. I am using the CodeIgniter framework. I have this code:

$config['upload_path'] = "uploads/";


 $path=$config['upload_path'];

        $config['overwrite'] = FALSE;
        $config['remove_spaces'] = TRUE;
        $config['allowed_types'] = 'gif|jpg|jpeg|png|JPEG|JPG|PNG';
        $config['max_size'] = '1024';
        $config['maintain_ratio'] = TRUE;
        $config['max_width'] = '1000';
        $config['max_height'] = '1000';
        $this->load->library('upload',$config);

But this isn't working properly. I am looking for a good solution where image is uploaded by my specified height and width.

  • 写回答

2条回答 默认 最新

  • douchang8758 2012-10-31 10:10
    关注

    This is the function I use to allow our staff to upload product images, it uploads the full size image and two smaller images (I only included the code for one here the tn_ version). It takes the values it does because it's in my controller and can be called from multiple places. $control is the name of the fileUpload control you're using, $path is the save path, $imageName is the from the control and sizes just allows me to specify which versions to make, in my case it receives all, med and tn as options. You could make as many or as few as you need. As VDP mentioned you're limited to under 2mb if you don't change any settings but that's fine for me so I just return an error if it's over that.

    I don't use the CI image upload library at all btw. It's just sent to the controller via a normal file upload and ajax. It uses an iframe on the main view to display errors or success.

    My Controller upload function:

    function doUpload($control, $path, $imageName, $sizes)
    {
        if( ! isset($_FILES[$control]) || ! is_uploaded_file($_FILES[$control]['tmp_name']))
        {
            print('No file was chosen');
            return FALSE;
        } 
        if($_FILES[$control]['size']>2048000)
        {
            print('File is too large ('.round(($_FILES[$control]["size"]/1000)).'kb), please choose a file under 2,048kb');
            return FALSE;
        }
        if($_FILES[$control]['error'] !== UPLOAD_ERR_OK)
        {
            print('Upload failed. Error code: '.$_FILES[$control]['error']);
            Return FALSE;
        }
        switch(strtolower($_FILES[$control]['type']))
        {
        case 'image/jpeg':
                $image = imagecreatefromjpeg($_FILES[$control]['tmp_name']);
                move_uploaded_file($_FILES[$control]["tmp_name"],$path.$imageName);
                break;
        case 'image/png':
                $image = imagecreatefrompng($_FILES[$control]['tmp_name']);
                move_uploaded_file($_FILES[$control]["tmp_name"],$path.$imageName);
                break;
        case 'image/gif':
                $image = imagecreatefromgif($_FILES[$control]['tmp_name']);
                move_uploaded_file($_FILES[$control]["tmp_name"],$path.$imageName);
                break;
        default:
               print('This file type is not allowed');
               return false;
        }
        @unlink($_FILES[$control]['tmp_name']);
        $old_width      = imagesx($image);
        $old_height     = imagesy($image);
    
    
        //Create tn version
        if($sizes=='tn' || $sizes=='all')
        {
        $max_width = 100;
        $max_height = 100;
        $scale          = min($max_width/$old_width, $max_height/$old_height);
        if ($old_width > 100 || $old_height > 100)
        {
        $new_width      = ceil($scale*$old_width);
        $new_height     = ceil($scale*$old_height);
        } else {
            $new_width = $old_width;
            $new_height = $old_height;
        }
        $new = imagecreatetruecolor($new_width, $new_height);
        imagecopyresampled($new, $image,0, 0, 0, 0,$new_width, $new_height, $old_width, $old_height);
        switch(strtolower($_FILES[$control]['type']))
        {
        case 'image/jpeg':
                imagejpeg($new, $path.'tn_'.$imageName, 90);
                break;
        case 'image/png':
                imagealphablending($new, false);
                imagecopyresampled($new, $image,0, 0, 0, 0,$new_width, $new_height, $old_width, $old_height);
                imagesavealpha($new, true); 
                imagepng($new, $path.'tn_'.$imageName, 0);
                break;
        case 'image/gif':
                imagegif($new, $path.'tn_'.$imageName);
                break;
        default:
        }
        }
    
        imagedestroy($image);
        imagedestroy($new);
        print '<div style="font-family:arial;"><b>'.$imageName.'</b> Uploaded successfully. Size: '.round($_FILES[$control]['size']/1000).'kb</div>';
    }
    

    View HTML:

    echo '<input type="file" name="manuLogoUpload" id="manuLogoUpload" onchange="return ajaxFileUpload2(this);"/>';
    

    View ajax call:

            function ajaxFileUpload2(upload_field)
            {
                var re_text = /\.jpg|\.gif|\.jpeg|\.png/i;
                var filename = upload_field.value;
                var imagename = filename.replace("C:\\fakepath\\","");
                if (filename.search(re_text) == -1) 
                {
                    alert("File must be an image");
                    upload_field.form.reset();
                    return false;
                }
                upload_field.form.action = "addManufacturerLogo";
                upload_field.form.target = "upload_iframe";
                upload_field.form.submit();
                upload_field.form.action = "";
                upload_field.form.target = "";
                document.getElementById("logoFileName").value = imagename;
                document.getElementById("logoFileName1").value = imagename;
                document.getElementById("manuLogoText").style.display="block";
                document.getElementById("logoLink").style.display="none";
                $.prettyPhoto.close();
                return true;        
            }
    

    Regular controller function:

    function addManufacturerLogo()
    {
        $control = 'manuLogoUpload';
        $image = $_FILES[$control]['name'];
        if($imageName = $this->doUpload($control,LOGO_PATH,$image,'all'))
        {
    
        } else {
    
        }
    }
    

    config/constants.php << for the LOGO_PATH. Change these (and the name) to suit your purposes. The reasoning is if I ever change where I want to save images I change it in the constants rather than in 10 places throughout my application.

    define('LOGO_PATH',APPPATH.'assets/images/manulogos/');
    define('PROD_IMAGE_PATH',APPPATH.'../assets/images/prod_images/');
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?