使用FormData,AJax和CakePHP上传文件

时间:2014-06-18 16:22:45

标签: ajax cakephp-2.0 form-data

好的,总而言之,我尝试使用FormDataCakePHP形式通过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对象。

任何想法??

1 个答案:

答案 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
        )

)