CakePHP - форма не отправляет поле файла

97
8

Я пытаюсь загрузить файл изображения в свое приложение, пользователь может изменить изображение своего профиля, загрузив изображение, но когда форма отправлена, он не отправит файл вместе с формой.

Я использую Meio Upload для загрузки моего файла, я вставлю действие и модель контроллера представления:

Посмотреть:

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

Модельные действия: Код:

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

спросил(а) 2011-08-23T01:36:00+04:00 9 лет, 1 месяц назад
1
Решение
58

Проблема заключалась в том, что я отправлял форму через AJAX, когда я сериализовал форму, в которую файл не был включен, я новичок в веб-дизайне, так что пока не знаю, как все работает, но кажется, что вы не может отправить файл через AJAX.

Поэтому я изменил свой код для работы без запроса AJAX и просто отправлю форму обычно с помощью POST, и он работал нормально.

ответил(а) 2011-08-29T18:05:00+04:00 9 лет назад
57

Вот несколько вещей, которые я хотел бы проверить:

В вашей функции контроллера перед сохранением вы можете проверить содержимое $this->data['image_url'] и посмотреть, не имеет ли поле error ненулевое значение. Коды ошибок перечислены в руководстве по PHP и могут дать вам ключ к проблеме.


Вы также можете протестировать его без ограничений типа MIME. MeioUpload, вероятно, (?) Полагается на тип MIME, о котором сообщает браузер, который, в свою очередь, почти наверняка основан только на расширении имени файла, обычно хорошо, но вы никогда не знаете. Я также знаю браузеры (Safari, я думаю?), Чтобы сообщать обо всем как application/octet-stream. (Вы также можете использовать PHP FileInfo, которая определяет тип MIME на основе содержимого файла.)

Во всяком случае, начать.

ответил(а) 2011-08-23T02:00:00+04:00 9 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема