我正在使用带有AJAX表单提交的蛋糕PHP文件上传。但它不是很好的。 $ _FILES数组中没有任何内容。但是当我使用普通表单提交时,它没有任何问题,工作正常。我使用以下代码使用AJAX提交表单
echo $this->Form->create('AlbumDetail',array('enctype' => 'multipart/form-data','type'=>'file'));
echo $form->input('Image',array("type" => "file"));
echo $ajax->submit('Add Album', array('url'=> array('controller'=>'album_details', 'action'=>'addalbum'), 'update' => 'album_update'));
虽然,
echo $this->Form->create('AlbumDetail', array('enctype' => 'multipart/form-data', 'controller' => 'album_details', 'action' => 'addalbum', 'type' => 'file'));
echo $form->input('Image',array("type" => "file"));
echo "<input name='submit' type='submit' value='Add Album'>";
工作没有任何问题,$ _FILES数组返回值。任何人都可以做一点帮助......?
答案 0 :(得分:2)
如void0所述,您无法使用Ajax发布文件。 This similar question 有一些解决方法和建议的库。
答案 1 :(得分:0)
看看这个CakePHP插件:https://github.com/srs81/CakePHP-AjaxMultiUpload
我认为这可能正是您所寻找的。 p>
答案 2 :(得分:0)
现在可以。
这就是我完成这项工作的方式。首先,我使用可上载行为来处理从https://github.com/cakemanager/cakephp-utils
上传的文件型号:
$this->addBehavior('Utils.Uploadable', [
'file' => [
'removeFileOnUpdate' => false,
'field' => 'file_tmp',
'path' => dirname(ROOT).'{DS}invoices{DS}',
'fileName' => '{field}'
]
]);
控制器:
public function ajaxInvoice() {
if ($this->request->is('ajax')) {
$this->autoRender = false;
$this->Invoices->deleteAll(['order_id' => $this->request->data['order_id']]);
$invoice = $this->Invoices->newEntity();
$invoice->order_id = $this->request->data['order_id'];
$invoice->file_tmp = $this->request->data['file']['name'];
$invoice = $this->Invoices->patchEntity($invoice, $this->request->getData());
$this->Invoices->save($invoice);
$this->response->body($invoice);
}
}
模板:
<?php use Cake\Routing\Router; ?>
<input type="file" class="upload<?= $id ?> hidden"><a data-id="<?= $id ?>" class="upload">Upload</a>
<script type = "text/javascript" > $(document).ready(function() {
$('.upload').on('click', function() {
var id = $(this).attr('data-id');
$('.upload' + id + '').click();
$('.upload' + id + '').change(function(e) {
e.stopImmediatePropagation();
var form = new FormData();
form.append('file', $(this)[0].files[0]);
form.append('order_id', id);
$.ajax({
type: "POST",
url: '<?php echo Router::url(array('controller ' => 'Invoices ', 'action ' => 'ajaxInvoice ')); ?>',
data: form,
cache: false,
contentType: false,
processData: false,
success: function(data, status, xhr) {
var response = JSON.parse(xhr.responseText);
},
});
});
});
});
</script>