CakePHP - 表单未提交文件字段
我正在尝试将图像文件上传到我的应用程序,用户可以选择通过上传图像来更改其个人资料图片,但是当提交表单时,它不会随表单一起提交文件。
我正在使用 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;
}
I'm trying to upload an image file to my application, the user can choose to change his profile picture by uploading an image, but when the form is submitted it's not submitting the file along with the form.
I'm using Meio Upload for my file uploading, i'll paste my view controller action and model:
View:
<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>
Action:
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'));
}
}
Model actsAs code:
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'),
)
)
);
The upload works fine in another part of my application but not in this case, any ideas?
echo $response;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题是我通过 AJAX 提交表单,当我序列化表单时,文件未包含在其中,我是网络开发新手,所以我不太了解所有内容的工作原理,但看起来你无法通过 AJAX 提交文件。
因此,我修改了代码,使其无需 AJAX 请求即可工作,只需使用 POST 正常提交表单即可,效果很好。
The problem was that I was submitting the form via AJAX, when I serialized the form the file wasn't included with it, I'm new to web dev so I don't quite know the workings of everything yet, but it seems you can't submit the file through AJAX.
So I modified my code to work without the AJAX request and just submit the form normally with a POST and it worked fine.
以下是我要检查的几件事:
在您的控制器函数中,在保存之前,您可以检查
$this->data['image_url']
的内容并查看error
字段非零。错误代码在 PHP 手册中枚举,并且可能为您提供解决问题的线索。您也可以在没有 MIME 类型限制的情况下对其进行测试。 MeioUpload 可能(?)依赖于浏览器报告的 MIME 类型,而浏览器报告的 MIME 类型几乎肯定仅基于文件扩展名 - 通常没问题,但你永远不知道。我还知道浏览器(Safari,我想?)将所有内容报告为
application/octet-stream
。 (您还可以使用 PHP 的 FileInfo,它根据文件内容确定 MIME 类型。 )无论如何,从某个地方开始。
Here are a couple of things I would check:
In your controller function, before you save, you might check the contents of
$this->data['image_url']
and see if theerror
field is non-zero. The error codes are enumerated in the PHP manual and might give you a clue to the problem.You might also test it without the MIME type restrictions in place. MeioUpload is probably(?) relying on the MIME type reported by the browser, which in turn is almost certainly based only on the filename extension—usually okay, but you never know. I've also known browsers (Safari, I think?) to report everything as
application/octet-stream
. (You can also use PHP's FileInfo, which determines MIME type based on file content.)Somewhere to start, anyway.