好的,总而言之,我尝试使用FormData
和CakePHP
形式通过ajax上传单个文件。问题是尝试通过错误记录控制器中的$this->request->data
来捕获数据会返回一个空文件数组。
所以,我已经使用CakePHP的助手设置了我的表单。但这种结构并不是真正相关的。使用的javascript将输出我们需要的任何调试。
所以这里是设置。我有一个名为RequestsController
的控制器,我的视图名称/功能是upload_files
。
这段javascript代码看起来像这样。注意,当文件输入元素的值发生变化时(即一旦他们选择了要上传的文件),就会调用此方法。
plugin.fileUpload = function(el)
{
el = $(el);
form = el.closest('form');
var files = el.get(0).files;
console.log(files.length)
var formData = new FormData();
for (var i = 0; i < files.length; i++)
{
var file = files[i];
console.log(file);
formData.append('files[]', file, file.name);
}
formData.append("username", "blablabl@gmail.com");
var xhr = new XMLHttpRequest();
xhr.open('POST', form.attr('action'), true);
xhr.onload = function () {
if (xhr.status === 200) {
toastr.success('Successfully loaded');
}
else
{
alert('An error occurred!');
}
};
xhr.send(formData);
console.log(files);
console.log(formData);
}
请原谅所有控制台日志。这是为了显示输出和调试。
您还会看到我还附加了一个用户名字段,只是为了测试帖子是否正确地将某些数据保存到控制器中。确实是。这是记录$this->request->data
数组的输出:
2014-06-18 17:51:41 Error: RequestsController::upload_files - Line 45
2014-06-18 17:51:41 Error: Array
(
[username] => blablabl@gmail.com
)
如您所见,用户名字段通过但不是文件。
我还将JS中的文件变量记录到控制台,看起来很棒。在Firebug中,它看起来像这样:
FileList { 0=File, length=1, item=item(), more...}
将FormData变量记录到控制台如下所示:
FormData { append=append()}
叹息时,FormData输出中没有任何内容表明文件正在将其传递给FormData对象。
任何想法??
答案 0 :(得分:0)
通过控制器中的FormData访问上传的文件就像访问任何表单提交的任何PHP脚本中的文件一样。
看起来,为了让我操作这些文件,我需要使用普通的$ _FILES变量来访问它们。
因此,登录我的控制器现在看起来像这样:
function upload_files()
{
if($this->request->is('post'))
{
CakeLog::write('error', print_r($_FILES, true));
}
}
我们得到一个漂亮,健康的文件数组,如下所示:
2014-06-18 22:13:29 Error: Array
(
[files] => Array
(
[name] => ReadMe.txt
[type] => text/plain
[tmp_name] => /tmp/phpOUTn8l
[error] => 0
[size] => 3627
)
)