【问题标题】:Serialization of 'Symfony\Component\HttpFoundation\File\UploadedFile' is not allowed'Symfony\Component\HttpFoundation\File\UploadedFile' 的序列化是不允许的
【发布时间】:2014-06-24 02:39:11
【问题描述】:

当我尝试上传与图像断言不匹配的错误文件时,会发生此错误。只接受图片。

用户实体:

<?php

namespace Test\BackBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 * @UniqueEntity(
 *     fields={"email"},
 *     message="This email already exists."
 *  )
 */
class User implements UserInterface
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="lastName", type="string", length=255)
     * @Assert\NotBlank()
     */
    private $lastName;

    /**
     * @var string
     *
     * @ORM\Column(name="firstName", type="string", length=255)
     * @Assert\NotBlank()
     */
    private $firstName;

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

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     * @Assert\Email()
     */
    private $email;

    /**
     * @var string
     *
     * @ORM\Column(name="password", type="string", length=255)
     * @Assert\NotBlank()
     */
    private $password;

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

    /**
     * @var array
     *
     * @ORM\Column(name="roles", type="array")
     * @Assert\NotBlank()
     */
    private $roles;

    /**
     * @var boolean
     *
     * @ORM\Column(name="isActive", type="boolean")
     */
    private $isActive;

    /**
     * @var string
     *
     * @ORM\Column(name="avatar", type="string", length=255, nullable=true)
     */
    private $path;

    /**
     * @var string
     *
     * @Assert\Image()
     */
    public $file;

    public function __construct()
    {
        $this->isActive = true;
        $this->salt = md5(uniqid(null, true));
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set lastName
     *
     * @param string $lastName
     * @return User
     */
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;

        return $this;
    }

    /**
     * Get lastName
     *
     * @return string 
     */
    public function getLastName()
    {
        return $this->lastName;
    }

    /**
     * Set firstName
     *
     * @param string $firstName
     * @return User
     */
    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;

        return $this;
    }

    /**
     * Get firstName
     *
     * @return string 
     */
    public function getFirstName()
    {
        return $this->firstName;
    }

    /**
     * Set job
     *
     * @param string $job
     * @return User
     */
    public function setJob($job)
    {
        $this->job = $job;

        return $this;
    }

    /**
     * Get job
     *
     * @return string 
     */
    public function getJob()
    {
        return $this->job;
    }

    /**
     * Set email
     *
     * @param string $email
     * @return User
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string 
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set password
     *
     * @param string $password
     * @return User
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

    /**
     * Get password
     *
     * @return string 
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * Set salt
     *
     * @param string $salt
     * @return User
     */
    public function setSalt($salt)
    {
        $this->salt = $salt;

        return $this;
    }

    /**
     * Get salt
     *
     * @return string 
     */
    public function getSalt()
    {
        return $this->salt;
    }

    /**
     * Set role
     *
     * @param array $role
     * @throws \InvalidArgumentException
     * @return User
     */
    public function setRoles($role)
    {
        if(array_diff($role, array("ROLE_SUPER_ADMIN", "ROLE_ADMIN", "ROLE_CUSTOMER"))) {
            throw new \InvalidArgumentException("Bad role");
        }
        $this->roles = $role;

        return $this;
    }

    /**
     * Get role
     *
     * @return array 
     */
    public function getRoles()
    {
        return $this->roles;
    }

    /**
     * Set isActive
     *
     * @param boolean $isActive
     * @return User
     */
    public function setIsActive($isActive)
    {
        $this->isActive = $isActive;

        return $this;
    }

    /**
     * Get isActive
     *
     * @return boolean 
     */
    public function getIsActive()
    {
        return $this->isActive;
    }

    /**
     * @inheritDoc
     */
    public function eraseCredentials()
    {
    }

    /**
     * Set username
     *
     * @param string $email
     *
     * @return string
     */
    public function setUsername($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get username
     *
     * @return string
     */
    public function getUsername()
    {
        return $this->email;
    }

    public function getAbsolutePath()
    {
        return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
    }

    public function getWebPath()
    {
        return null === $this->path ? null : $this->getUploadDir().'/'.$this->path;
    }

    protected function getUploadRootDir()
    {
        return __DIR__.'/../../../../web/'.$this->getUploadDir();
    }

    protected function getUploadDir()
    {
        return 'uploads/img';
    }

    public function upload()
    {
        if (null === $this->file) {
            return;
        } else {
            $this->path = $this->firstName.'_'.$this->lastName.'_'.sha1(uniqid(mt_rand(), true)).'.'.$this->file->guessExtension();
        }

        $this->file->move($this->getUploadRootDir(), $this->path);

        $this->file = null;
    }

    public function getPath()
    {
        return $this->getWebPath();
    }
}

用户类型:

$builder
    ->add('firstName', 'text', array(
                    'required' => true
                ))
     ->add('lastName', 'text', array(
                    'required' => true
                ))
     ->add('email', 'email', array(
                    'required' => true
                ))
     ->add('job', 'text', array(
                    'required' => false
                ))
     ->add('file', 'file', array(
                    'label' => false,
                    'required' => false,
                ))
            ;

控制器:

    public function updateMyAccountAction($id, Request $request)
    {
        $entityManager = $this->get('doctrine')->getManager();

        $user = $this->get('doctrine')
            ->getRepository('TestBackBundle:User')
            ->find($id);

        if (!$user) {
            throw $this->createNotFoundException('Unable to find User entity.');
        }

        $editForm = $this->createForm(new UserType(), $user);

        $editForm->handleRequest($request);

        if ($editForm->isValid()) {

            $user->upload();

            $entityManager->persist($user);
            $entityManager->flush();
            $this->get('session')->getFlashBag()->add('success', 'Your profile has been updated');

            return $this->redirect($this->generateUrl('my_account', array('id' => $id)));
        } else {
            $this->get('session')->getFlashBag()->add('error', 'Erreur');

            return $this->redirect($this->generateUrl('my_account', array('id' => $id)));
        }
    }

当我尝试测试图像断言是否可以更新例如 pdf 文件时,会发生此错误。该文件未更新,因此很好。但是我的闪存包和控制器中的重定向不起作用...如果我在控制器中的 else 中写入 var_dump("test") 会显示 "test" 并且错误也会因此 Symfony 检测到表单无效。

这是发生错误时堆栈跟踪的一部分:

在 /home/user/www/sf2/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php 在第 155 行

152.                $this->roles,
153.                $this->attributes
154.            )
155.        );
    }
    /**

在序列化 (array(object(User), true, array(object(Role)), array())) 在 /home/kevin/www/sf2/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php 在第 155 行

看了,感觉是roles属性序列化有问题,因为它是一个数组(我们要声明这个属性为数组实现UserInterface

那么为什么会出现这个错误呢?

【问题讨论】:

    标签: php symfony serialization file-upload


    【解决方案1】:

    我找到了解决方案:我必须像这样实现Serializable 接口:official doc

    【讨论】:

    • 现在官方链接页面不包含序列化信息
    • 对于 Symfony symfony.com/doc/2.6/cookbook/security/entity_provider.html
    【解决方案2】:

    DOZ 词的额外精度很少:

    最好在您的图像(或文件,或@Vich\Uploadable)实体中实现\Serializable,而不是在用户实体上实现\Serializable,因为在这种情况下您可能会破坏登录。

    如果您像我一样使用 VichUploader,请不要在您的用户实体上添加 \Serializable 并将其添加到您的 @Vich\Uploadable(图像或文件)实体上并添加两种方法:

    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->image,
        ));
    }
    
    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->image,
        ) = unserialize($serialized, array('allowed_classes' => false));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      相关资源
      最近更新 更多