1

関数に次のコードブロックがあります。

$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!";
       }

アップロードする前に画像のサイズを変更したいと思います。CodeIgniterフレームワークを使用しています。私はこのコードを持っています:

$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);

しかし、これは正しく機能していません。指定した高さと幅で画像をアップロードする良い解決策を探しています。

4

2 に答える 2

4

これは、スタッフが製品画像をアップロードできるようにするために使用する関数であり、フルサイズの画像と2つの小さい画像をアップロードします(ここでは1つのコードのみをtn_バージョンに含めました)。それは私のコントローラーにあり、複数の場所から呼び出すことができるので、それが行う値を取ります。$ controlは、使用しているfileUploadコントロールの名前、$ pathは保存パス、$ imageNameはコントロールからの名前であり、サイズを使用すると、作成するバージョンを指定できます。私の場合は、medとtnのすべてを受け取ります。オプションとして。必要な数だけ作成することも、少なくすることもできます。VDPが述べたように、設定を変更しない場合は2 MB未満に制限されますが、それは私にとっては問題ないので、それを超えるとエラーが返されます。

ところで、CIイメージアップロードライブラリはまったく使用していません。通常のファイルアップロードとajaxを介してコントローラーに送信されます。メインビューでiframeを使用して、エラーまたは成功を表示します。

コントローラーのアップロード機能:

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>';
}

HTMLを表示:

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

ajax呼び出しを表示する:

        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;        
        }

通常のコントローラー機能:

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

    } else {

    }
}

config / constants.php<<LOGO_PATHの場合。目的に合わせてこれら(および名前)を変更してください。その理由は、画像を保存したい場所を変更した場合、アプリケーション全体で10箇所ではなく、定数で変更するためです。

define('LOGO_PATH',APPPATH.'assets/images/manulogos/');
define('PROD_IMAGE_PATH',APPPATH.'../assets/images/prod_images/');
于 2012-10-31T10:10:46.480 に答える
3

クライアント側のツールを使用してローカルで画像のサイズを変更してからアップロードすることをお勧めします。サーバー側でも (php gd を使用して) サイズを変更できますが、php はファイルをメモリにコピーし、デフォルトでは最大 +/- 2MB の画像しかサイズ変更できません。php を使用してアップロード サイズとサイズ変更を制限するか、Flash、Silverlight、または JavaApplets を使用できます。

これは、フラッシュを使用したクライアント側のサイズ変更に関する別の質問です

アップデート:

CI の Image Manipulation lib を使用したサーバー側のサイズ変更の例

$config['image_library'] = 'gd2';
$config['source_image'] = $_FILES['image']['tmp_name'];
$config['new_image'] = $target_path
$config['maintain_ratio'] = TRUE;
$config['width']    = 250;
$config['height']   = 400;

$this->load->library('image_lib', $config); 

if (!$this->image_lib->resize()) {
    echo $this->image_lib->display_errors();
}

サイズ変更ライブラリの詳細

于 2012-10-31T09:34:34.823 に答える