Где вы храните загруженный пользователем контент в приложении Symfony 4? - PullRequest
0 голосов
/ 14 февраля 2020

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

    $form = $this->createForm(ProfileUpdateForm::class);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid())
    {
        $user = $this->getUser();
        $firstname = $form->get('firstname')->getData();
        $lastname = $form->get('lastname')->getData();
        $picture = $form->get('profilepicture')->getData();

        if($picture == null)
        {
            $user
            ->setFirstName($firstname)
            ->setLastName($lastname);
        }
        else
        {
            $originalFilename = pathinfo($picture->getClientOriginalName(), PATHINFO_FILENAME);
            // this is needed to safely include the file name as part of the URL
            $safeFilename = strtolower(str_replace(' ', '', $originalFilename));
            $newFilename = $safeFilename.'-'.uniqid().'.'.$picture->guessExtension();

            try {
                $picture->move(
                    'build/images/user_profiles/',
                    $newFilename
                );
            } catch (FileException $e) {
                $this->addFlash("error", "Something happened with the file upload, try again.");
                return $this->redirect($request->getUri());
            }

            // updates the 'picture' property to store the image file name
            // instead of its contents
            $user
            ->setProfilePicture($newFilename)
            ->setFirstName($firstname)
            ->setLastName($lastname);
        }

        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();

        $this->addFlash("success", "Your profile was updated!");
        return $this->redirectToRoute('account');
    }

    return $this->render('account/profile.html.twig', [
        'profileform' => $form->createView()
    ]);

Эта проблема, которую я обнаружил, что каждый раз, когда я компилирую свой (локальный) проект, изображение затем удаляется (потому что каталог public / build создается путем удаления и повторного создания).

Если я не ошибаюсь, разве это не работает, как развертывания? И если да, то это правильный способ загрузить изображение? Как правильно это сделать?

1 Ответ

1 голос
/ 14 февраля 2020

Я не уверен, почему, но ваш каталог public/ не должен быть удален.
Если вы используете Webpack Encore, то содержимое public/build/ удаляется и создается снова при компиляции ресурсов. Но не public/.

Для загрузки мы создаем каталог public/upload/.
Затем большую часть времени мы устанавливаем некоторые глобальные переменные, которые позволяют нам сохранять только имя файла.

Глобальные переменные для Twig в config/packages/twig.yaml, которые "root" будут в вашем public/ каталоге

twig:
    globals:
        app_ul_avatar: '/upload/avatar/'
        app_ul_document: '/upload/document/'

И глобальные переменные для ваших контроллеров, хранилищ и т. Д. c в config/services.yaml

parameters:
    app_ul_avatar: '%kernel.root_dir%/../public/upload/avatar/'
    app_ul_document: '%kernel.root_dir%/../public/upload/document/'

Это удобно, потому что, как я только что сказал, вы можете сохранить только имя файла в базе данных.

Это означает, что если у вас есть папка public/upload/img/, и Если вы также хотите создавать эскизы, вы можете создать public/upload/img/thumbnail/, и в вашей базе данных ничего не изменится, и вам не нужно сохранять дополнительный путь.

Просто создайте новый глобальный app_ul_img_thumbnail, и вы set.

Тогда все, что вам нужно сделать, это вызвать глобальные вызовы, когда они вам понадобятся, и связаться с именем файла:

В Twig:

{{ app_ul_avatar~dbResult.filename }}

Или в Контроллер:

$this->getParameter('app_ul_avatar').$dbResult->getFilename();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...