Събмитване на AJAX заявка за смяна на снимка не ми пълни базата от данни
Имам форма, която е писана по документацията на Symfony и работи добре, но рефрешва страницата при събмит затова реших да направя AJAX заявка да сменям снимката без да обновявам цялата страница. Проблемът е че съм написал заявката, прехвърлям данните, но незнайно защо името на новата снимка не се появява в базата или в папката където ги съхранявам. Това ми е кодът в момента(контролерът):
/**
* @Route("/upload", name="uploadpic")
* @param Request $request
* @return JsonResponse|\Symfony\Component\HttpFoundation\Response
*/
public function uploadAction(Request $request){
if(!$request->isXmlHttpRequest()){
return new JsonResponse(
array(
'message' => 'Error',
'status' => 'Not received'
), 400);
}
$user = $this->get('security.token_storage')->getToken()->getUser();
$formed = $this->createForm(UserPic::class, $user);
$formed->handleRequest($request);
if(isset($request->request)) {
$postPicture = $request->files->get('picture_data');
$file = $user->getUserPic();
$fileName = $postPicture->generateUniqueFileName() . '.' . $file->guessExtension();
$file->move(
$this->getParameter('users_directory'),
$fileName
);
$user->setUserPic($fileName);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $this->render('default/index.html.twig',
['formed' => $formed->createView()]);
}
}
Пробвах и с $postPicture = $request->request->get('picture_data'); вместо $postPicture = $request->request->get('picture_data'); , защото принципно така работи като пращам текст от textarea с AJAX към базата.
Пробвах и $fileName = $this->generateUniqueFileName() . '.' . $file->guessExtension(); вместо $fileName = $postPicture->generateUniqueFileName() . '.' . $file->guessExtension();, защото така е писано в документацията, но и така не работи.
Кодът ми на AJAX request-а:
$("#submit_pic").on('click', function(event){
event.preventDefault();
event.stopPropagation();
$.ajax({
type: "POST",
url: "/profile",
data: {
picture_data: new FormData($("#pic_data")[0])
},
processData: false,
contentType: false,
success: function () {
console.log();
},
error: function () {
console.log("Error here");
}
});
});
Пробвах с променяне на picture_data: $("#pic_data").serialize() с picture_data: new FormData($("#pic_data")[0]), защото четох един пост в stackoverflow че не работело така. Не разбирам защо не сетва нов image като AJAX-а дори не изплюва грешка.
Промених пътя да е "/upload", признавам че е недоглеждане от моя страна, но сега ми гъми с 500 internal server error. Дали не предавам данните правилно? Пробвах и със .serilize и с new FormData и все същата грешка...
Редактирах си поста.
Това ми е темплейта ако искате да погледнете, но там всичко е наред май. Грешката идва от AJAX-а, мисля че не стига изобщо до контролера:
{% if app.user.userPic is null %} <div class="" id="imageUpload"> <p> <label for="pic_data"> <img src="{{ asset('/pictures/anonimous.jpg') }}" class="rounded-circle" id="userPic"/> </label> <br/> </p> <form method="POST" enctype="multipart/form-data" action="{{ path('uploadpic') }}"> <p> <input type="file" id="pic_data" name="app_bundle_user_pic[userPic]" required> </p> <button type="submit" id="submit_pic" name="app_bundle_user_pic[Change]" class="btn btn-success btn-sm"> Change </button> </form> </div> {% else %} <div class="" id="imageUpload"> <p> <label for="pic_data"> <img src="{{ asset('/uploads/images/'~app.user.userPic) }}" class="rounded-circle" id="userPic"/> </label> <br/> </p> <form method="POST" enctype="multipart/form-data" action="{{ path('uploadpic') }}"> <p> <input type="file" id="pic_data" name="app_bundle_user_pic[userPic]" required> </p> <button type="submit" id="submit_pic" name="app_bundle_user_pic[Change]" class="btn btn-success btn-sm"> Change </button> </form> </div> {% endif %}