0

アプリケーションに画像ファイルをアップロードしようとしています。ユーザーは画像をアップロードしてプロフィール写真を変更することを選択できますが、フォームが送信されたときに、フォームと一緒にファイルが送信されません。

ファイルのアップロードに Meio Upload を使用しています。View Controller のアクションとモデルを貼り付けます。

意見:

<div class="prepend-1 span-8">
<?php
    echo $this->Form->create('Fonyker', array('action' => 'edit', 'class' => 'span-8', 'type' => 'file'));
?>
    <div class="span-3">
      <label for="FonykerImage" class="span-3 last">Profile Image</label>
      <div class="span-4 preview" style="border-color:black; border:dotted 2px; height:80px; width:80px">
        <img src="<?php echo $this->data['Fonyker']['image_url'];?>" style="width:80px;height:80px;"/>
      </div>
    </div>
    </br>
<?php
    echo $this->Form->input('image_url', array(
      'div' => array(
        'class' => 'span-5 last'
      ),
      'label' => array(
        'text' => 'Upload an image'
      ),
      'type' => 'file'
    ));

    echo $this->Form->input('username', array(
      'div' => array(
        'class' => 'span-8'
      ),
      'class' => 'input-text long',
      'label' => array(
        'text' => 'Username'
      ),
      'onsubmit' => 'return false;'
    ));

    echo $this->Form->input('email', array(
      'div' => array(
        'class' => 'span-8'
      ),
      'class' => 'input-text long',
      'label' => array(
        'text' => 'Email'
      ),
      'onsubmit' => 'return false;'
    ));

    echo $this->Form->input('name', array(
      'div' => array(
        'class' => 'span-8'
      ),
      'class' => 'input-text long',
      'label' => array(
        'text' => 'Name'
      ),
      'onsubmit' => 'return false;'
    ));

?>
        <div class="span-8 required">
            <label for="FonykerBirthdate">Birthdate</label>
            <input id="FonykerBirthdate" type="text" onsubmit="return false;" name="data[Fonyker][birthdate]" class="datepicker input-text long" enabled="false" value="<?php echo $this->data['Fonyker']['birthdate']; ?>">
        </div>
<?php

    $options = array('M' => 'M', 'F' => 'F');
    $attributes = array(
      'empty' => 'Gender',
      'class' => 'input-combo',
      'label' =>  array(
        'text' => 'Birthdate'
      )
    );

    echo $this->Form->select('gender', $options, NULL, $attributes);

    echo $this->Form->submit('Save', array(
      'class' => 'button medium blue',
      'id' => 'save-account-button'
    ));

?>
    <input id="FonykerId" type="hidden" name="data[Fonyker][id]" value="<?php echo $this->data['Fonyker']['id']?>">
<?php
    echo $this->Form->end();
?>
<div id="account-message" class="span-8" style="display: none;"></div>
</div>

アクション:

function edit() {
      $this->layout = 'ajax';
      $this->autoRender = false;
      $this->Fonyker->recursive = -1;
      $response = null;

      if (!empty($this->data)) {
        $this->Fonyker->read(null, $this->data['Fonyker']['id']);
        pr($this->data);

        if ($this->Fonyker->save($this->data)) {
          $response = json_encode(array('ok' => true, 'msg' => 'Account information updated'));
        } else {
          $response = json_encode(array('ok' => false, 'msg' => 'Failed to update account'));
        }
      }

モデルの actAs コード:

var $actsAs = array(
    'MeioUpload' => array( 
      'image_url' => array(
        'dir' => 'img/profile_pictures',
        'create_directory' => true,
        'allowed_mime' => array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png'),
        'allowed_ext' => array('.jpg', '.jpeg', '.png', '.gif','.JPG'),
      )
    )
  ); 

私のアプリケーションの別の部分ではアップロードは正常に機能しますが、この場合はうまくいきません。何かアイデアはありますか?

      echo $response;
    }
4

2 に答える 2

2

問題は、AJAX 経由でフォームを送信していたことです。フォームをシリアル化したときに、ファイルが含まれていませんでした。 AJAX 経由でファイルを送信できません。

そのため、AJAX リクエストなしで機能するようにコードを変更し、POST を使用して通常どおりフォームを送信すると、正常に機能しました。

于 2011-08-29T15:05:31.017 に答える
1

ここに私がチェックするいくつかのことがあります:

コントローラー関数では、保存する前に、の内容をチェックして$this->data['image_url']errorフィールドがゼロでないかどうかを確認できます。エラー コードはPHP のマニュアルに列挙されており、問題の手がかりになる可能性があります。

MIME タイプの制限を適用せずにテストすることもできます。MeioUpload はおそらく (?) ブラウザによって報告された MIME タイプに依存しており、これはほぼ確実にファイル拡張子のみに基づいています。通常は問題ありませんが、わかりません。また、ブラウザー (Safari だと思いますか?) がすべてをapplication/octet-stream. (ファイルの内容に基づいて MIME タイプを決定する PHP のFileInfoを使用することもできます。)

とにかく、どこかから始めましょう。

于 2011-08-22T23:00:36.900 に答える