如何使用带有Symfony2的ajax / jQuery上传文件

谁能帮助我?

我正在尝试编写一个脚本,当用户单击图像时,这会触发数据库中的图像进行更新。

为此,我编写了代码,该代码暂时在控制器中生成方法的调用者行,但是当我发送表单时,由于Cross-Site-Request-Forgery而未对其进行validation。

$("#upload_picture").on('click', function (e) { e.preventDefault(); $("#bundle_user_file").trigger('click'); }); $("#bundle_user_file").change(function () { if (this.files && this.files[0]) { var reader = new FileReader(); reader.onload = function (e) { $('.active-img').attr('src', e.target.result); }; reader.readAsDataURL(this.files[0]); ajax_formData() } }); 

这是我的来电线ajax,是以FormData的forms进行处理发布,捕获路由和令牌。 他调用路由,但不确定图像是否正常,即使使用Inspector Firefox也是如此。

 function ajax_formData() { var at = $("form[name=bundle_user]"); var formData = new FormData(); formData.append('file', $("input[type=file]")[0].files[0]); var url = at.attr('action') + '?_token=' + $("#bundle_user__token").val(); $.ajax({ type: "PUT", url: url, data: formData, success: function (data) { alert("success: " + data.message); }, fail: function (data) { alert("error: " + data.message); }, cache: false, contentType: false, processData: false, xhr: function () { // Custom XMLHttpRequest var myXhr = $.ajaxSettings.xhr(); if (myXhr.upload) { // Avalia se tem suporte a propriedade upload myXhr.upload.addEventListener('progress', function () { /* faz alguma coisa durante o progresso do upload */ }, false); } return myXhr; } }); 

}

这是控制器中的方法,它通过一个通用调用点击按钮提交更改我的图像。 但正如我在ajax电话会议前所说,他回答称令牌不可用

 public function updateAction(Request $request, $id) { $this->denyAccessUnlessGranted('ROLE_USER', null, 'Unable to access this page!'); $em = $this->getDoctrine()->getManager(); $entity = $this->getUser(); if ($entity->getId() != $id) { $response = new JsonResponse( array( 'message' => 'Não tem permissao' ), 400); return $response; } $form_update = $this->updateForm($entity); $form_update->handleRequest($request); if ($form_update->isValid()) { $entity->upload(); $em->persist($entity); $em->flush(); return new JsonResponse(array('message' => 'Success!'), 200); } $response = new JsonResponse( array( 'message' => $form_update->getErrors() ), 400); return $response; } 

首先,我注意到#upload_image的click事件触发了#bundle_user_file上的单击触发器,但在此之下,您要求它查找更改事件。 因此,这无济于事。

如果需要,可以通过执行以下操作调用csrf token_manager服务来重新生成CSRF令牌:

 /** @var \Symfony\Component\Security\Csrf\CsrfTokenManagerInterface $csrf */ $csrf = $this->get('security.csrf.token_manager'); $token = $csrf->refreshToken($tokenId); return new Response($token); 

如果需要,您可以在表单中确定$ tokenId,或者只使用您的图片ID,或其他任何内容。 通常,CSRF令牌会自动从您的会话生成,因此您可能也想检查它。

 function upload_img(){ var file_data = $('.myform').find('.drawing').prop("files")[0]; var form_data = new FormData(); form_data.append("drawing", file_data); $.ajax({ url: "upload.php", type: "POST", data: form_data, contentType: false, dataType:'json', cache: false, processData:false, success: function(data) { }, error: function() { } }); }