user1847729
user1847729

Reputation: 81

Jquery file upload, how to return response with symfony2?

I want to upload a file with jquery-file-upload (blueimp) in cross domain to a symfony2 application.

To do this, client side :

SLjQuery(function () {
    'use strict';

    SLjQuery('#media_answer_answer').fileupload({
        url: "http://recrutonline.dev/app_dev.php/api/media/questionnaire-test-media/uploads",
        dataType: 'text',
        formData: SLjQuery('form#answer_process_form').serializeArray(),
        forceIframeTransport: true,
        redirect: 'http://mywebsite.dev/result.html?%s',
        done: function (e, data) {
            console.log('upload ok ', data)
        },
        progressall: function (e, data) {
            console.log(data.loaded/data.total);
            var progress = parseInt(data.loaded / data.total * 100, 10);
            SLjQuery('#progress .progress-bar').css(
                'width',
                progress + '%'
            );
        }
    }).prop('disabled', !SLjQuery.support.fileInput)
      .parent().addClass(SLjQuery.support.fileInput ? undefined : 'disabled')
    ;
});

in my controller symfony :

public function postMediaUploadAction(Request $request)
{
    $requestData = $request->request->all();
    $redirectResponse = $requestData['redirect']; // http://mywebsite.dev/result.html?%s
    //...
    //here process on data & get file uploaded
    //...

    //example of data I would send back to the client : http://mywebsite.dev/result.html?{'file':[{'name':'filetoupload.jpg'}]}
    $response = str_replace("%s", "{'file':[{'name':'filetoupload.jpg'}]}", $redirectresponse); // is it the good method ?
    return ??
}

Now client side response received :

in console.log of 'done' parameter of ajax function:

data.result -> undefined
data.textStatus -> "success"

I tried to return many things but result is still undefined. So do you know what kind of data I have to return ?

Upvotes: 1

Views: 722

Answers (1)

Sander Toonen
Sander Toonen

Reputation: 3573

Are you using the OneupUploaderBundle?

If so, don't post the file to your own controller but send it to the Oneup uploader endpoint. You can then return custom data by implementing an event listener.

For instance:

namespace Foo\BarBundle\EventListener;

use Oneup\UploaderBundle\Event\PostPersistEvent;

class UploadListener
{
    public function onUpload(PostPersistEvent $event)
    {
        if ($file = $event->getFile()) {
            $response = $event->getResponse();
            $response['file']['name'] = $file->getKey();
        }
    }
}

Register this event listener in your services.yml (or xml file):

# Event listener to handle uploaded files
foo_bundle.upload_listener:
    class: Foo\BarBundle\EventListener\UploadListener
    tags:
        - { name: kernel.event_listener, event: oneup_uploader.post_persist.default_uploader, method: onUpload }

When you do want to handle the upload yourself, which I don't recommend, return a Symfony\Component\HttpFoundation\Response or even better a Symfony\Component\HttpFoundation\JsonResponse object. See documentation.

Upvotes: 1

Related Questions