【问题标题】:Serialization of UploadedFile is not allowed (only when max size is reach)不允许对 UploadedFile 进行序列化(仅在达到最大大小时)
【发布时间】:2019-02-23 11:58:04
【问题描述】:

大家好,我正在尝试做一个表格来修改个人资料的图像。一切正常,但是当我放置一个大尺寸的图像(除了在数据库中之外)我有这个错误:

不允许序列化“Symfony\Component\HttpFoundation\File\UploadedFile”

我不知道为什么约束不起作用......(它在我创建配置文件时起作用,但在我修改它时不起作用)谢谢所有试图回答的人

我把我的代码放在那里:(控制器)

    $loggedAs = $this->getUser();
    $avatar_profile = $loggedAs->getAvatarPath();
    $em = $this->getDoctrine()->getManager();

$form = $this->createForm(ProfileModificationType::class, $loggedAs);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        /**
         * @var UploadedFile $file
         */
        $file = $form->get('avatarPath')->getData();
        if ($file != NULL) {
            $fileName = md5(uniqid()) . '.' . $file->guessExtension();

            $file->move(
                $this->getParameter('image_directory'), $fileName
            );
            $loggedAs->setAvatarPath($fileName);
        } else {
            $loggedAs->setAvatarPath($avatar_profile);
        }
        $loggedAs->setSalt(md5(uniqid()));

        $loggedAs->setPassword($encoder->encodePassword($loggedAs, $loggedAs->getPassword()));
        $em->flush();

        $this->get('session')->getFlashBag()->add('success', "Votre compte a été modifié");

表格:

->add('avatarPath', FileType::class, array(
            'data_class' => null,
            'required' => false,
            'label' => 'Avatar',
            'constraints' => array(
                new Assert\Image(array(
                    'maxHeight' => 600,
                    'maxWidth' => 600,
                    'maxSize' => 1000000,
                    'maxHeightMessage' => 'Longeur maximale de 600Px',
                    'maxWidthMessage' => 'Largeur maximale de 600Px',
                    'maxSizeMessage' => 'Taille maximale de 1Mo',
                ))),
            'invalid_message' => 'Cette valeur est invalide',
        ));

在我的实体配置文件中(约束):

public static function loadValidatorMetadata(ClassMetadata $metadata)
{
    $metadata->addPropertyConstraint('avatarPath', new Assert\Image(array(
        'maxHeight' => 600,
        'maxWidth' => 600,
        'maxSize' => 1000000,
        'maxHeightMessage' => 'Longeur maximale de 600Px',
        'maxWidthMessage' => 'Largeur maximale de 600Px',
        'maxSizeMessage' => 'Taille maximale de 1Mo',
    )));
}

和我的实体

/**
 * @var string
 *
 * @ORM\Column(name="avatar_path", type="string", length=255, nullable=false)
 */
private $avatarPath;

【问题讨论】:

    标签: php image symfony upload


    【解决方案1】:

    您的User 类中似乎还没有实现\Serializable 接口。

    引用自 symfony 文档:

    在每个请求结束时,User 对象被序列化到会话中。在下一个请求中,它被反序列化。为了帮助 PHP 正确执行此操作,您需要实现 Serializable。

    请参考documentation,以便您更好地了解如何执行此操作。

    编辑:您在创建新的User 对象时未收到此信息的原因是此用户未登录,因此其对象未序列化。只有登录的 User 对象被序列化并存储到会话中,以便您的应用程序知道谁是当前登录的用户。

    即使您尝试编辑与登录用户不同的用户,您也不应该因为相同的原因而遇到该错误。

    【讨论】:

    • 好的,我会试试这个,但是为什么当我在“新用户”页面上放一张好的图片甚至是坏的图片时它会起作用? ..
    • 如此正常(我现在无法测试)但如果我将 $this->getUser() ($loggedAs 变量)更改为 $loggedAs = $em->getRepository('AppBundle:Profile ')->findOneBy(array('id' => $this->getUser()->getId(), ));这将正常工作?
    • 没有。实际上,教义甚至不会对数据库进行额外调用,因为它知道该对象已被获取。
    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 2013-01-09
    相关资源
    最近更新 更多