我正在尝试使用FOSUserBundle在symfony2项目中向我的用户实体添加个人资料图片。我已经使用symfony2文件上传过程,当我使用FOSUserBundle时,我只有上传和数据库持久存在的问题。
这是我的实体:
namespace ICGM2\UserBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* @ORM\Entity
* @ORM\Table(name="user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
public $path;
/**
* @Assert\File(maxSize="6000000")
*/
public $file;
/* * *************************************************************** */
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->file) {
$this->path = uniqid('', true) . '.' . $this->file->guessExtension();
}
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
if (null === $this->file) {
return;
}
$this->file->move($this->getUploadRootDir(), $this->path);
unset($this->file);
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
if ($file == $this->getAbsolutePath()) {
unlink($file);
}
}
public function getAbsolutePath()
{
return null === $this->path ? null : $this->getUploadRootDir() . '/' . $this->path;
}
public function getWebPath()
{
return null === $this->path ? null : $this->getUploadDir() . '/' .
$this->id . '/' . $this->path;
}
protected function getUploadRootDir()
{
return __DIR__ . '/../../../../web/' . $this->getUploadDir() . '/' . $this->id;
}
protected function getUploadDir()
{
return 'uploads/users';
}
/**
* Set path
*
* @param string $path
* @return User
*/
public function setPath($path)
{
$this->path = $path;
return $this;
}
/**
* Get path
*
* @return string
*/
public function getPath()
{
return $this->path;
}
...
表格:UserType.php
$builder->add('file', 'file', array(
'required' => false
));
答案 0 :(得分:2)
嗨,如果有人在这里遇到同样的问题他的解决方案。 我更改了用户实体中的一些功能:
/**
* @param UploadedFile $file
* @return object
*/
public function setFile(UploadedFile $file = null)
{
// set the value of the holder
$this->file = $file;
// check if we have an old image path
if (isset($this->path)) {
// store the old name to delete after the update
$this->t = $this->profilePicturePath;
$this->tempPath = null;
} else {
$this->path = 'initial';
}
return $this;
}
/**
* Get the file used for profile picture uploads
*
* @return UploadedFile
*/
public function getFile()
{
return $this->file;
}
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->getFile()) {
// a file was uploaded
// generate a unique filename
$filename = $this->generateRandomProfilePictureFilename();
$this->setPath($filename . '.' . $this->getFile()->guessExtension());
}
}
/**
* Generates a 32 char long random filename
*
* @return string
*/
public function generateRandomProfilePictureFilename()
{
$count = 0;
do {
$generator = new SecureRandom();
$random = $generator->nextBytes(16);
$randomString = bin2hex($random);
$count++;
} while (file_exists($this->getUploadRootDir() . '/' . $randomString . '.' . $this->getFile()->guessExtension()) && $count < 50);
return $randomString;
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
if (null === $this->file) {
return;
}
$this->getFile()->move($this->getUploadRootDir(), $this->getPath());
if (isset($this->tempPath) && file_exists($this->getUploadRootDir() . '/' . $this->tempPath)) {
unlink($this->getUploadRootDir() . '/' . $this->tempPath);
$this->tempPath = null;
}
$this->file = null;
}