通过Symfony2中的服务保存不同类型的文件



我已经成功创建了一个服务和一个侦听器,可以自动将文件保存在我的帖子实体中。

一切正常,除了我需要在帖子实体中添加另一个字段:'photo'。使用以下代码尽可能多的代码的正确方法是什么?我试图将一些参数传递给听众,但我可以使它起作用...

应保存小册子: Web/uploads/hobhures 和照片下: web/uploads/photos

用户必须同时提供小册子和照片。

感谢您的所有帮助。

services.yml:

# brochure uploader service
app.brochure_uploader:
    class: AppBundleUtilsFileUploader
    arguments: [ '%brochures_directory%' ]
# uploaded files for Post entity
app.doctrine_brochure_listener:
    class: AppBundleEventListenerBrochureUploadListener
    arguments: [ '@app.brochure_uploader' ]
    tags:
        - { name: doctrine.event_listener, event: prePersist }
        - { name: doctrine.event_listener, event: preUpdate }     

utils/fileuploader.php:

namespace AppBundleUtils;
use SymfonyComponentHttpFoundationFileUploadedFile;
class FileUploader
{
    private $targetDir;
    public function __construct($targetDir)
    {
        $this->targetDir = $targetDir;
    }
    public function upload(UploadedFile $file = null)
    {
        $fileName = md5(uniqid()).'.'.$file->guessExtension();
        $file->move($this->targetDir, $fileName);
        return $fileName;
    }
    public function getTargetDir() {
        return $this->targetDir;
    }
}

EventLister/brochureuploadlistener.php:

类brochureuploploadlistener{ 私人$ uploader;

public function __construct(FileUploader $uploader)
{
    $this->uploader = $uploader;
}
public function prePersist(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();
    $this->uploadFile($entity);
}
public function preUpdate(PreUpdateEventArgs $args)
{
    $entity = $args->getEntity();
    $this->uploadFile($entity);
}
private function uploadFile($entity)
{
    if (!$entity instanceof Post) {
        return;
    }
    $file = $entity->getBrochure();
    if (!$file instanceof UploadedFile) {
        return;
    }
    $fileName = $this->uploader->upload($file);
    $entity->setBrochure($fileName);
}

}

form/postType.php:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
       [...]
        ->add('brochure', 'SymfonyComponentFormExtensionCoreTypeFileType', array(
            'label' => 'Brochure (PDF file)',
            'data_class' => null,
        ))
       [...]
    ;
}

entity/post.php

/**
 * @ORMColumn(type="string")
 *
 * @AssertFile(mimeTypes={ "application/pdf" })
 */
private $brochure;  

不要重新发明轮子。使用Vichuploaderbundle(也由官方Symfony文档提出)并Live Happy

最新更新