JQuery - Enviar archivos mediante petición ajax de jquery

   
Vista:

Enviar archivos mediante petición ajax de jquery

Publicado por Jose (2 intervenciones) el 21/01/2016 14:14:58
Hola a todos!!

Necesito poder mandar varios campos de un formulario incluido uno de tipo "file" por ajax para luego poder guardar los datos en la base de datos con Symfony2. Lo hice sin petición ajax siguiendo esta documentación:"http://symfony.com/doc/2.3/cookbook/controller/upload_file.html" y se guarda correctamente todo, pero a la hora de querer hacerlo por ajax tengo problema con el campo "file" y por más que busco en la web sólo se habla de FormData, pero no sé usarlo ni mandarlo junto con mis otros datos y tampoco sé cómo usarlo luego en el controlador para que funcione mi código.

El código que uso es el siguiente:

Controlador:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public function createAction(Request $request)
    {
        if ($request->isXmlHttpRequest() && !$request->isMethod('POST')) {
        throw new HttpException('XMLHttpRequests/AJAX calls must be POSTed');
        }
 
        $entity = new Student();
        $form = $this->createCreateForm($entity);
        $form->handleRequest($request);
 
        if ($form->isValid()) {
           $file = $entity->getPhoto();
 
           $fileName = md5(uniqid()).'.'.$file->guessExtension();
 
           $photoDir = $this->container->getParameter('kernel.root_dir').'/../web/uploads/images';
 
           $file->move($photoDir, $fileName);
 
           $entity->setPhoto($fileName);
 
           $em = $this->getDoctrine()->getManager();
           $em->persist($entity);
           $em->flush();
 
           if ($request->isXmlHttpRequest()) {
                return new JsonResponse(array('message' => 'Success!','success' => true), 200);
            }
 
            if ($request->isMethod('POST')) {
            return new JsonResponse(array('message' => 'Invalid form','success' => false), 400);
        }
 
          return $this->redirect($this->generateUrl('student_show', array('id' => $entity->getId())));
        }
        return $this->render('BackendBundle:Student:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
        ));
    }

Entidad:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use Doctrine\ORM\Mapping as ORM;
       use Symfony\Component\Validator\Constraints as Assert;
 
       //...
       /**
       * @var string
       *
       * @ORM\Column(name="photo", type="string", length=255, nullable=true)
       * @Assert\File(mimeTypes={ "image/png","image/jpg" })
       */
       private $photo;
 
 
       public function setPhoto($photo)
       {
        $this->photo = $photo;
 
        return $this;
       }
 
       public function getPhoto()
       {
        return $this->photo;
       }


Formtype:

1
2
3
4
5
    //...
 
       ->add('photo', 'file', array('required' => false))
 
       //... 


Javascript:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  //...
 
    $('.form_student').on("submit",function(event) {
     event.preventDefault();
 
     $.ajax({
      type: 'POST',
      url: Routing.generate('student_create'),
      data: $(this).serialize(),
      dataType: 'json',
 
      success: function(response) {
 
       alert(response.message);
      },
      error: function (response, desc, err){
          if (response.responseJSON && response.responseJSON.message) {
             alert(response.responseJSON.message);
          }
          else{
             alert(desc);
          }
      }
     });
    });
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Enviar archivos mediante petición ajax de jquery

Publicado por Jose (2 intervenciones) el 21/01/2016 15:38:50
Lo he solucionado con estos cambios:

1
data: new FormData($(this)[0])

en lugar de
1
data: $ (this).serialize()

Y añadiendo en la petición ajax:

1
2
3
processData: false,
contentType: false,
cache: false,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

Enviar archivos mediante petición ajax de jquery

Publicado por xve (557 intervenciones) el 21/01/2016 16:08:33
Gracias por comentarlo Jose!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar