使用Symfony2,如何从请求中获取ajax发布数据?

时间:2014-12-30 17:17:27

标签: javascript html ajax symfony jquery-file-upload

我想上传一个带有jquery-file-upload(blueimp)的文件,其中包含跨域的一些数据。

因此在客户端,我使用jqueryfileupload中basic.html文件中的代码。我刚为跨域添加了forceIframeTransport(doc here)& formData(格式类型为doc here)。

var idResp = {name:'id-resp',value: SLjQuery('#media_answer_answer').data('id-resp')};
var dataSup = $('form#answer_process_form').serializeArray();
dataSup.push(idResp);

$(function () {
    'use strict';
    $('#media_answer_answer').fileupload({
        url: "mywebsite.dev/app_dev.php/api/media/questionnaire-test-media/uploads",
        dataType: 'json',
        formData: dataSup,
        forceIframeTransport: true,
        done: function (e, data) {
            console.log('upload ok ', data);
        },
        progressall: function (e, data) {
             console.log(data.loaded/data.total);
        }
    }).prop('disabled', !$.support.fileInput)
      .parent().addClass($.support.fileInput ? undefined : 'disabled')
    ;
    $('#media_answer_answer').fileupload(
        'option',
        'redirect',
        'mywebsite.dev/result.html?%s'
    );
});

当我通过输入选择文件时,进入控制台,progressall的日志为1.所以它似乎正在发送。此外,我可以在控制台的网络选项卡中看到发送的请求

//in request headers
Content-Length: 43463
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvU5EBWuRkyGkSRBS
...
//in request payload
------WebKitFormBoundaryvU5EBWuRkyGkSRBS
Content-Disposition: form-data; name="media_answer[_token]"

e6583ea5230f1f80a218825ed399115925556f0c
------WebKitFormBoundary1JHxUF9xgtcO5fJ2
Content-Disposition: form-data; name="id-resp"

420
------WebKitFormBoundaryvU5EBWuRkyGkSRBS
Content-Disposition: form-data; name="media_answer[answer]"; filename="file-to-upload.jpg"
Content-Type: image/jpeg

------WebKitFormBoundaryvU5EBWuRkyGkSRBS--

//in response headers
...
X-ChromeLogger-Data: eyJ2ZXJzaW9uIjoiNC4wIiwiY29sdW1.... // I think this is the file in base64
...

现在在服务器端,我使用FosRestBundle进行路由。在我的symfony控制器中,我想获取数据和文件。

//result of request
POST /app_dev.php/api/media/questionnaire-test-media/uploads  HTTP/1.1 
Accept:          text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
...
Content-Length:  43463 
Content-Type:    multipart/form-data; boundary=----WebKitFormBoundaryBqSBpxJ6Wyvi2QJH 

所以内容长度是43463,所以我认为有一些东西,但在控制器$request->getContent()中是空的$request->request->all()

您知道数据是否被发送?如果是,如何获取有效载荷中的数据?非常感谢新年快乐

1 个答案:

答案 0 :(得分:2)

最后,symfony的记录器并没有在$request->request->all()上显示任何内容,但在控制台的预览标签中,我可以在$request->request->all()上看到一些var_dump并且它不是空的(我想发誓自己),它包含请求有效载荷的第一个数据(内容处理形式数据),但不包含最后一个(Content-Type:image / jpeg)。

我必须将第二个数据更改为

------WebKitFormBoundaryvU5EBWuRkyGkSRBS
Content-Disposition: form-data; name="media_answer[idResp]"

420

然后在控制器中我可以得到这样的数据:

$r = $request->request->all(); // or using $request->getContent() it's also possible in a different way
$rt = $r['media_answer']['_token']; // e6583ea5230f1f80a218825ed399115925556f0c
$ri = $r['media_answer']['id-resp']; // 420

对于最后的数据:name="media_answer[answer]" filename="file-to-upload.jpg" 正如我在上面的评论中所说,我可以得到这样的文件:

$request->files->get('media_answer[answer]', array(), true)

所以对于文件名:

$request->files->get('media_answer[answer]', array(), true)->getClientOriginalName()