多次上传文件不保存
Multiple upload the files are not saved
我尝试使用 VichUploader Bundle 保存多个文件。
文件名保存在数据库中,但不幸的是,文件没有移动到正确的文件夹中。
我使用 Symfony 4 和 VichUploaderBundle 1.8.3。
这是我的相册 class :
/**
* @ORM\Entity(repositoryClass="App\Repository\AlbumRepository")
* @ORM\HasLifecycleCallbacks
*/
class Album
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Photo", mappedBy="album", orphanRemoval=true, cascade={"persist", "remove"})
*/
private $photos;
/**
* @ORM\Column(type="datetime")
*/
private $createdAt;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $description;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
...
}
现在,照片
/**
* @ORM\Entity(repositoryClass="App\Repository\PhotoRepository")
* @Vich\Uploadable()
* @ORM\HasLifecycleCallbacks
*/
class Photo
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $imageName;
/**
* @Vich\UploadableField(mapping="album_images", fileNameProperty="imageName")
* @var File
*/
private $imageFile;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Album", inversedBy="photos")
* @ORM\JoinColumn(nullable=false)
*/
private $album;
/**
* @ORM\Column(type="datetime")
* @var \DateTime
*/
private $updatedAt;
...
}
好的,所以,为了使用 Bundle,我编写了一个 DataTransformer 将 UploadedFile 转换为 Photo。这样,我就可以操作一组照片了。
这个PhotoTransformer很简单,我只是想将文件从前端移动到后端
class PhotoTransformer implements DataTransformerInterface
{
public function transform($value)
{
//We won't reverse the operation. It goes from front-end to back-end.
return [];
}
public function reverseTransform($value)
{
$photos = [];
foreach ($value as $file) {
$photo = new Photo();
$photo->setImageFile($file);
$photos[] = $photo;
}
return $photos;
}
}
这是我的专辑类型:
class AlbumType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
return $builder
->add('title', TextType::class)
->add('description', TextareaType::class)
->add($builder->create(
'photos', FileType::class, [
'required' => false,
'multiple' => true
]
)->addModelTransformer(new PhotoTransformer())
)
->add('button', SubmitType::class, [
'label' => 'Create'
]);
}
}
如您所见,我遵循了 here 的规则。
传递给 "setImageFile" 的 var 是一个 UploadedFile。
然而,不幸的是,这不会触发服务器上载。
你知道我错过了什么吗?
问题出在 vich_uploader.yaml,upload_destination 不正确。
所以我在一个地方检查,文件在另一个地方上传。
现在一切正常。
可能是因为你没有使用文件移动方法,所以没有成功?
$photo->move($targetDirectory, $filename);
我尝试使用 VichUploader Bundle 保存多个文件。 文件名保存在数据库中,但不幸的是,文件没有移动到正确的文件夹中。
我使用 Symfony 4 和 VichUploaderBundle 1.8.3。
这是我的相册 class :
/**
* @ORM\Entity(repositoryClass="App\Repository\AlbumRepository")
* @ORM\HasLifecycleCallbacks
*/
class Album
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Photo", mappedBy="album", orphanRemoval=true, cascade={"persist", "remove"})
*/
private $photos;
/**
* @ORM\Column(type="datetime")
*/
private $createdAt;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $description;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
...
}
现在,照片
/**
* @ORM\Entity(repositoryClass="App\Repository\PhotoRepository")
* @Vich\Uploadable()
* @ORM\HasLifecycleCallbacks
*/
class Photo
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $imageName;
/**
* @Vich\UploadableField(mapping="album_images", fileNameProperty="imageName")
* @var File
*/
private $imageFile;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Album", inversedBy="photos")
* @ORM\JoinColumn(nullable=false)
*/
private $album;
/**
* @ORM\Column(type="datetime")
* @var \DateTime
*/
private $updatedAt;
...
}
好的,所以,为了使用 Bundle,我编写了一个 DataTransformer 将 UploadedFile 转换为 Photo。这样,我就可以操作一组照片了。
这个PhotoTransformer很简单,我只是想将文件从前端移动到后端
class PhotoTransformer implements DataTransformerInterface
{
public function transform($value)
{
//We won't reverse the operation. It goes from front-end to back-end.
return [];
}
public function reverseTransform($value)
{
$photos = [];
foreach ($value as $file) {
$photo = new Photo();
$photo->setImageFile($file);
$photos[] = $photo;
}
return $photos;
}
}
这是我的专辑类型:
class AlbumType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
return $builder
->add('title', TextType::class)
->add('description', TextareaType::class)
->add($builder->create(
'photos', FileType::class, [
'required' => false,
'multiple' => true
]
)->addModelTransformer(new PhotoTransformer())
)
->add('button', SubmitType::class, [
'label' => 'Create'
]);
}
}
如您所见,我遵循了 here 的规则。 传递给 "setImageFile" 的 var 是一个 UploadedFile。
然而,不幸的是,这不会触发服务器上载。
你知道我错过了什么吗?
问题出在 vich_uploader.yaml,upload_destination 不正确。 所以我在一个地方检查,文件在另一个地方上传。
现在一切正常。
可能是因为你没有使用文件移动方法,所以没有成功?
$photo->move($targetDirectory, $filename);