Как загрузить файл с помощью ajax / jQuery с помощью Symfony2

Может ли кто-нибудь мне помочь?

Я пытаюсь написать сценарий, который, когда пользователь нажимает на изображение, запускает изображение в базе данных для обновления.

Для этого я написал код, который временно делает Caller Line метода в контроллере, но когда я отправляю форму, он не проверяется из-за Cross-Site-Request-Forgery.

$("#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() } }); 

Это моя Caller Line ajax, выполняет обработку в форме с помощью FormData для публикации, поймает маршруты и токен. Он называет маршрут, но не уверен, что изображение идет или нет, даже с инспектором 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; } }); 

}

Это метод в controlodor он с общим вызовом с нажатием кнопки, чтобы отправить изменение моего изображения. Но, как я уже говорил перед призывом 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; } 

Во-первых, я замечаю, что ваше событие click для #upload_image запускает триггер щелчка на #bundle_user_file, но ниже того, что вы просите его искать событие изменения. Поэтому это ничего не сделало бы.

Вы можете повторно сгенерировать токен CSRF, если хотите, вызвав службу csrf token_manager, выполнив следующие действия:

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

Вы можете определить $ tokenId в своей форме, если хотите, или просто использовать свой идентификатор изображения или что угодно. Обычно токен 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() { } }); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form class='myform'> <input type='file' class='drawing' onchange='upload_img()' > </form>