2

Codeigniterの写真アップロードシステムに問題があります。

コントローラへの登録中に写真をアップロードしてサイズ変更しています。それが完了すると、写真を再度表示したい「アップロード成功」ビューをロードします。

問題は、

  • 私は実際には失敗していないように見える「失敗」ループに足を踏み入れます

  • ビューを初めてロードしたとき、写真は表示されません(ただし、写真はアップロードされ、サイズが変更され、パスはDBにあります)。しかし、ページを更新すると、正しく表示されます。

これがコントローラーです..下部にあるコメントを確認してください。上部は基本的にサイズ変更ロジックであり、(今はちょっと醜いですが)機能します。

public function do_upload()
{
    $config['upload_path'] = './upload_pic/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size'] = '100';
    $config['max_width']  = '1200';
    $config['max_height']  = '768';
    $_maxResizedWidth = '242';

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

    if ( $this->upload->do_upload() )
    {
        $this->data['upload_data'] = $this->upload->data();
        $this->data['title'] = "Upload Successful";

         switch($this->data['upload_data']['file_type']){
            case "image/jpg":
                $_file_suffix = ".jpg";
                break;
            case "image/jpeg":
                $_file_suffix = ".jpg";
                break;
            case "image/png":
                $_file_suffix = ".png";
                break;
            case "image/gif":
                $_file_suffix = ".gif";
                break;
            case "image/pjpeg":
                $_file_suffix = ".jpg";
                break;
         }

        $_fileName = $this->data['upload_data']['file_name']; 
        $_oldUploadPath = $config['upload_path'] . $_fileName;
        $_random_key = strtotime(date('Y-m-d H:i:s'));
        $_newUploadPath = $config['upload_path'] . 'resize_' . $_random_key . $_file_suffix;
        rename( $_oldUploadPath, $_newUploadPath );

        $_oldSize = getimagesize($_newUploadPath);
        $_oldWidth = $_oldSize[0];

        if($_oldWidth > $_maxResizedWidth){
            $_scale = $_maxResizedWidth/$_oldWidth;
            $_oldHeight = $_oldSize[1];
            $_imageType = image_type_to_mime_type($_oldSize[2]);
            $_newWidth = $_oldWidth * $_scale;
            $_newHeight = $_oldHeight * $_scale;
            $_resizedImage = imagecreatetruecolor($_newWidth, $_newHeight);
            switch($_imageType) {
                case "image/gif":
                    $_source=imagecreatefromgif($_newUploadPath); 
                    break;
                case "image/pjpeg":
                case "image/jpeg":
                case "image/jpg":
                    $_source=imagecreatefromjpeg($_newUploadPath); 
                    break;
                case "image/png":
                case "image/x-png":
                    $_source=imagecreatefrompng($_newUploadPath); 
                    break;
            }
            imagecopyresampled($_resizedImage, $_source, 0, 0, 0, 0, $_newWidth, $_newHeight, $_oldWidth, $_oldHeight);
            switch($_imageType) {
                case "image/gif":
                    imagegif($_resizedImage,$_newUploadPath); 
                    break;
                case "image/pjpeg":
                case "image/jpeg":
                case "image/jpg":
                    imagejpeg($_resizedImage,$_newUploadPath,90); 
                    break;
                case "image/png":
                case "image/x-png":
                    imagepng($_resizedImage,$_newUploadPath);  
                    break;
            }
        }

        $_newUploadPathWithoutDot = substr($_newUploadPath,1);

        $this->load->model('Member_model');
        $ID = $this->the_user->id;

             /// ****************************************************************************
             /// I step into this next if loop even though the upload_photo method does work.  
            /// In my view I get the "there was a problem" .. but the DB has been correctly updated

        if(!$this->Member_model->upload_photo( $ID, $_newUploadPathWithoutDot));
        {
            $uploadData = $this->upload->data();
            $this->data['message'] = "There was a problem entering your photo in the database ==";
        };

              /// And this is the view that's called
        $this->load->view('upload_big_success_view', $this->data);
    }
    else
    {
        $this->data['message'] = "there was a problem " . $this->upload->display_errors() . dirname(__FILE__);
        $this->data['title'] = "Upload Unsuccessful";
        $this->load->view('profile_photo_view', $this->data);
    }
}

(そこには厄介なものがたくさんあることを知っているので、リファクタリングを行います)。

アップロード、サイズ変更、ファイルパスがDBに入力されているにもかかわらず、ビューが最初に読み込まれたときに画像が「準備ができていない」ように見えます...最後に到達するまでエラーはスローされませんでしたループし、「-> upload_photo()」が失敗したのに失敗したと思われるようです。そして、初めてビューを呼び出すと..

<img src"<?php echo $the_user->large_image_location; ?>" > 

..出力を生成しません。しかし、単純な更新の後、それは行います。「問題のメッセージがありました」がまだビューに表示されていますが。

ところで-これがモデルです。特別なことは何もありません。

public function upload_photo($ID, $_newUploadPath)
{
    $sql = "UPDATE users SET large_image_location=? WHERE id=?";
    $query = $this->db->query($sql, array($_newUploadPath, $ID));
    return $query;  
}

それで、何かアイデアはありますか?

4

1 に答える 1

1

Codeigniterはビューの読み込み時にページを更新しないため、画像が読み込まれることはありません。代わりに、関数を使用してページを更新するようにCodeigniterに指示する必要がありredirect()ます。メソッドの最後に成功ビューをロードする代わりにdo_upload()、成功ページにリダイレクトする必要があります。

メソッドを作成し、upload_big_success()ロードupload_big_success_viewしてから、そのメソッドにリダイレクトします。


次の行を置き換えますdo_upload()

$this->load->view('upload_big_success_view', $this->data);

と:

redirect(upload_big_success, 'location');


次に、同じコントローラーで成功ページのメソッドを作成します。

public function upload_big_success() {
   // And this is the view that's called
   $this->load->view('upload_big_success_view');
}
于 2012-12-10T03:51:22.477 に答える