Loading...
ivanp avatar ivanp 0 Точки

Събмитване на 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-а дори не изплюва грешка.

Тагове:
0
PHP MVC Frameworks
dimaldim92 avatar dimaldim92 149 Точки

Route-а в контролера ти е /upload , а ajax заявката ти поства на /profile ...?

 

Пробвай да не изпращаш формата като object към PHP скритпа:

data: new FormData($("#pic_data")[0])

В контролера може да дъмпнеш да видиш дали се е изпратило:

$request->files->get('името на инпута') или var_dump($request->files->all()); да се ориентираш.

Или дай скайп направо да го оправиме :)

0
28/12/2018 15:34:15
ivanp avatar ivanp 0 Точки

Промених пътя да е "/upload", признавам че е недоглеждане от моя страна, но сега ми гъми с 500 internal server error. Дали не предавам данните правилно? Пробвах и със .serilize и с new FormData и все същата грешка...

0
dimaldim92 avatar dimaldim92 149 Точки

Редактирах си поста.

0
ivanp avatar ivanp 0 Точки

Това ми е темплейта ако искате да погледнете, но там всичко е наред май. Грешката идва от 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 %}
0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.