0

ここで初めて、うまくいけば最後ではありません。

現在、CodeIgniter に基づいたアプリケーションを開発しています。ページ ビューで使用されている Uploadify スクリプトがコントローラーを複数回呼び出していることに (CI ログを使用して) 気付くまでは、すべて問題ありませんでした。

もう少しうまく説明するには...

私のニュースコントローラーには、このコードを含む編集があります

public function edit(){
    $id = (int)$this->uri->segment(4);

    if (empty($id)){
        $this->session->set_flashdata('error', "ID can't be empty");
        redirect('admin/news');
    }

    //article data called here and stored in $data
    $data = $this->news_model->fetch_article($id);

    $data['title'] = "News";
    $data['news_links'] = $this->news_model->get_news_links();
    $data['form_url'] = "admin/edit";
    $data['available_pages'] = $this->news_model->get_article_pages();


    $data['css'] = "/css/extra/uploadify.css";
    $data['js'] = "/js/extra/jquery.uploadify-3.1.min.js";
    $data['edit'] = true;


    //set uploadify key
    $data['key'] = md5(time() . $this->session->userdata('session_id'));
    // a unique key is created, then stored in database
    // the key is then passed to the uploadify script
    // when the upload is being done it is checked with the one in the database
    // if the two match files are uploaded. This is a workaround for flash
    // session problem
    $this->news_model->set_key($data['key']);

    if($this->input->post('submit')){
        $this->save_article("update",$id);
    }


    $this->load->view("admin/news",$data);
}

私の見解では、このように Uploadify を呼び出しました

    $('#extra_data').uploadify({
    'swf'      : '<?php echo site_url(); ?>flash/uploadify.swf',
    'uploader' : '<?php echo site_url(); ?>admin/uploadify',
    'multi'     : true,
    'auto'      : false,
    'fileTypeExts'     : '*.jpg;*.jpeg;*.gif;*.png',
    'fileTypeDesc'    : 'Images',
    'formData'      : {'key' : '<?php echo $key; ?>'},
    'onQueueComplete': function(){
        ajax_images(); //calls a function that loads uploaded image thumbnails
    }
}); 

編集 - Uploadify コントローラーの追加

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Uploadify extends CI_Controller{

function __construct(){
    parent::__construct();

    // contains set_key / check_key / get_key / add_image functions
    $this->load->model('admin/news_model');
}

public function index(){
    if($this->news_model->check_key($this->input->post("key",true))){

        $this->upload_image();

    }else{
        log_message('error', "The hash key isn't correct! No upload has been done!");
    }
}

public function load_images(){
    $data = $this->news_model->get_images($this->uri->segment(4));

    foreach($data as $image){
        ?>
        <div style="background:url(<?php echo site_url(); ?>images/uploads/thumb_<?php echo $image->file; ?>) no-repeat"> 
            <a class="delete" href="javascript:void(0);" onclick="remove_pic('<?php echo site_url(); ?>admin/news/remove_picture/<?php echo $image->id; ?>')"></a>
        </div>
        <?php
    }
}

private function upload_image($case = "article"){
    $this->load->library("imaging");
    $this->imaging->upload($_FILES['Filedata']);

    $file_name = md5(time().$this->input->post("key"));
    $target_path = $_SERVER['DOCUMENT_ROOT'] . "/images/uploads/";

    if ($this->imaging->uploaded){

        $this->imaging->file_new_name_body   = $file_name;
        $this->imaging->file_auto_rename      = true;
        $this->imaging->image_resize         = false;
        $this->imaging->mime_check          = true;
        $this->imaging->allowed = array('image/*');
        $this->imaging->process($target_path);

        $this->imaging->file_name_body_pre = 'thumb_';
        $this->imaging->file_new_name_body   = $file_name;
        $this->imaging->image_resize          = true;
        $this->imaging->image_ratio_crop      = true;
        $this->imaging->image_y               = 148;
        $this->imaging->image_x               = 148;
        $this->imaging->process($target_path);

        if ($this->imaging->processed) {
            $this->news_model->add_image($this->input->post("key",true),$file_name . "." . $this->imaging->file_src_name_ext);
            $handle->clean();
        } else {
            log_message('error', $this->imaging->error);
        }
    }else{
        log_message('error', $this->imaging->error);
    }

}

}

編集 No2 - get/set/check キーの f-ions の追加

function set_key($key)
{

    $data['key'] = $key;

    $this->db->where('id', 1);
    $this->db->update('uploadify_key', $data);

    log_message("debug", "Uploadify key set to " . $key);
}



function get_key($id)
{

    $this->db->select('key');
    $this->db->where('id', $id);
    $query = $this->db->get('uploadify_key');

    $row = $query->row();

    return $row->key;


}

function check_key($key,$id = 1)
{

    $db_key = $this->get_key($id);

    if($key == $db_key)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }

}

function clear_key($id){
    $data['key'] = "";

    $this->db->where('id', $id);
    $this->db->update('uploadify_key', $data);
}

function add_image($hash, $file){
    $data['file'] = $file;
    $data['hash'] = $hash;

    $this->db->insert("images", $data);
}

function get_images($hash){
    $this->db->select("id, file");
    $return = $this->db->get_where("images",array("hash" => $hash));

    return $return->result();
}

私のuploadifyコントローラーには、$key上記のチェックとファイルアップロードコードがあります。

News と Uploadify の 2 つのコントローラーがあることに注意してください。

問題は、コードの特定の部分を分離することで、Uploadify Javascript が News コントローラーを再度呼び出していることを発見したことです。ログへのリンクは次のとおりです- http://pastebin.com/JkHAy5cN

その問題は、キーがリセットされ、Javascript に渡されたキーとデータベースに保存されているキーが一致しないことです。私はこれに困惑しています。

提案、修正、コメントは大歓迎です。

ありがとうございました!

4

1 に答える 1

0

2 つのコントローラー機能を同時に使用するのではなく、1 つだけ使用します。それはCIの仕組みではありません。したがって、JavaScript をnews/editコントローラー関数に向けます。この関数には、実際のアップロードを行うコードを含める必要があります。これは、上に表示されていないためです。しかし、まず最初に、JS を修正します。

これの代わりに:

    'uploader' : '<?php echo site_url(); ?>admin/uploadify',

これを行う:

    'uploader' : '<?php echo site_url(); ?>news/edit',

コントローラー関数news/editからコード追加します。admin/uploadify

于 2012-05-07T22:29:31.330 に答える