0

うまくいけば、これは簡単な問題です。

画像をアップロードしてデータベーステーブルに保存するように Cakephp MVC を設定しています。インデックス、ビュー、追加は思い通りに機能しています。

ただし、編集ビューでは、変更を維持するためにアップロードされた画像が現在レコードにあることをどのように示すことができますか。

既存のファイル名を表示するには、ファイル入力ボタンの属性に何を設定すればよいかわかりません。

<div class="imageEdit form">
<?php
    echo $this->Form->create('VwImage', array('action' => 'edit', 'type' => 'file') );
    echo $this->Form->input('image_category', array(
        'options' => $partCat,
        'selected' => $this->data['VwImage']['image_category'],
         'type'=>'select', 'empty' => '(Choose One)'));
    echo $this->Form->input('description');         
    echo $this->Form->input('image', array( 'value' => $this->data['VwImage']['file_name'],
                        'type' => 'file'));

    echo $this->Form->submit('Save');
    echo $this->Form->end();
?>

編集用コントローラーコード

    public function edit( $id = null) {

    $this->loadModel('VwPartsCategory');
    $partCat= $this->VwPartsCategory->find('list',
                array( 'order' => 'short_name ASC' )); // Get parts categories from the database
    $this->set('partCat', $partCat);

    if(!$id && empty($this->request->data)) {
        $this->Session->setFlash('Invalid Id for Image');
        $this->redirect(array('action' => 'index'));
    } 

    if (!empty($this->request->data) &&
        is_uploaded_file($this->request->data['VwImage']['image']['tmp_name'])) {

        $fileData = fread(fopen($this->request->data['VwImage']['image']['tmp_name'], "r"),
                $this->request->data['VwImage']['image']['size']);

        /** get image information **/
        $size = getimagesize($this->request->data['VwImage']['image']['tmp_name']);
        $image_width = $size[0];
        $image_height = $size[1];
        $image_size = $size[3];
        $image_type = $size['mime'];
        $image_thumb = null;

        /** Create a second variable for the thumbnail **/
        $thumb_data = $this->request->data['VwImage']['image']['tmp_name'];
        $aspect_ratio = (float) ($image_width / $image_height );
        $thumb_height = 100;
        $thumb_width = $thumb_height * $aspect_ratio;
        if($image_type == 'image/jpeg' ) {
            $src = ImageCreateFromjpeg($thumb_data);
            $destImage = ImageCreateTrueColor($thumb_width, $thumb_height);
            ImageCopyResampled($destImage, $src, 0,0,0,0, $thumb_width, $thumb_height, $image_width, $image_height);
            ob_start();
            imageJPEG($destImage);
            $image_thumb = ob_get_contents();
            ob_end_clean();
        }
        if($image_type == 'image/gif' ) {
            $src = ImageCreateFromgif($thumb_data);
            $destImage = ImageCreateTrueColor($thumb_width, $thumb_height);
            ImageCopyResampled($destImage, $src, 0,0,0,0, $thumb_width, $thumb_height, $image_width, $image_height);
            ob_start();
            imageJPEG($destImage);
            $image_thumb = ob_get_contents();
            ob_end_clean();
        }
        if($image_type == 'image/png' ) {
            $src = ImageCreateFrompng($thumb_data);
            $destImage = ImageCreateTrueColor($thumb_width, $thumb_height);
            ImageCopyResampled($destImage, $src, 0,0,0,0, $thumb_width, $thumb_height, $image_width, $image_height);
            ob_start();
            imageJPEG($destImage);
            $image_thumb = ob_get_contents();
            ob_end_clean();
        }


        $this->request->data['VwImage']['file_name'] = $this->request->data['VwImage']['image']['name'];
        $this->request->data['VwImage']['file_type'] = $this->request->data['VwImage']['image']['type'];
        $this->request->data['VwImage']['size'] = $this->request->data['VwImage']['image']['size'];                 
        $this->request->data['VwImage']['image'] = $fileData;
        $this->request->data['VwImage']['id'] = $id;

        if(!$image_thumb == null) {
            $this->request->data['VwImage']['image_thumb'] = $image_thumb;
            $this->request->data['VwImage']['thumb_height'] = $thumb_height;
            $this->request->data['VwImage']['thumb_width'] = $thumb_width;
            if ($this->VwImage->save($this->request->data)) {
                $this->Session->setFlash('This image has been save');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash('This Image could not be saved. Please try again.');
            }
        } else {

            $this->Session->setFlash('Unsupported Image Type could not be saved. Please try again.');
        }           
    }
    if (empty($this->request->data)) {
        $this->request->data = $this->VwImage->read(null, $id);
    /** pr($this->request->data); die; **/
    }
}

乾杯マイク

4

1 に答える 1

1

問題:

CakePHP 2.0の本によると:

HTML 自体の制限により、「ファイル」タイプの入力フィールドにデフォルト値を設定することはできません。フォームが表示されるたびに、内部の値は空になります。

(javascript を使用して) ハッキングする方法はあると思いますが、そのフィールドにデフォルトを設定しようとするのは標準的ではありません。「ファイル」入力でファイルを選択すると、ローカル ファイルへのパスが挿入されます。それがどのパスかをどうやって知ることができますか?


ソリューション:

代わりに、ファイル名とともに「前のファイル名」を示す行を上または下に追加するか、画像の場合は前のファイルのサムネイルを表示します。

于 2015-06-09T13:50:59.683 に答える