【问题标题】:Symfony 3 VichUploaderBundle not moving images to the correct directorySymfony 3 VichUploaderBundle 没有将图像移动到正确的目录
【发布时间】:2016-08-12 01:47:12
【问题描述】:

我正在尝试将 VichImageBundle 与 Symfony3 一起使用,目前还没有关于 S3 新的 FormType::class 调用与 Vich Image Bundle 结合使用的文档。除了移动部分,我一切正常。

我在这里的项目里面做了一个文件夹结构:web/images/aod_images

我在 yml 文件中设置了这样的配置:

vich_uploader:
    db_driver: orm 

    mappings:      
        aod_images:
            uri_prefix:         /images/aod_images
            upload_destination: %kernel.root_dir%/../web/images/aod_images

实体属性在这里:(我有 getter 和 setter)

/**
 * @Vich\UploadableField(mapping="aod_images", fileNameProperty="dailyChartName")
 * 
 * @var File
 */
private $dailyChart;

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

/**
 * @Vich\UploadableField(mapping="aod_images", fileNameProperty="twohourChartName")
 * 
 * @var File
 */
private $twohourChart;

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

我在控制器类中适当地调用设置时间方法,特别是在 editAction 和 newAction 控制器上:

$analysis->setUpdatedAt(new \DateTime('now'));

到目前为止,在该实体的 FormType 类中,我有以下内容:

->add('dailyChartName', FileType::class, array())
->add('twohourChartName', FileType::class, array())

我不确定要为每个图像实例传递哪些选项给 ->add 方法。

应用程序正在正确构建表单。

当我对 dev.log 执行 tail -f 操作时,我收到以下消息,作为教义.DEBUG 频道的一部分:

(Symfony\\Component\\HttpFoundation\\File\\UploadedFile: /Applications/MAMP/tmp/php/phpEz6kJO)","13":"[object] (Symfony\\Component\\HttpFoundation\\File\\UploadedFile: /Applications/MAMP/tmp/php/phpVkbZgi)

图像名称属性与我在 config.yml 文件中映射的内容不匹配。相反,路径反映了我的本地机器路由到内部 php tmp 目录。使用 server:run 命令后,我从 127.0.0.1:8000 运行它。

当我查看该目录时,图像被移到那里。

正在将(不正确的)图像名称复制到数据库中。但是图像的路径是空的(路径不正确)。另外正确的路径/目录也是空的。

问候!

编辑

根据 Matteo 的建议,我对 FormType.php 文件进行了以下更改。

->add('dailyChart', VichFileType::class, array(
            'required' => TRUE,
        ))
->add('twohourChart', VichFileType::class, array(
            'required' => TRUE,            
        ))

编辑 2

为了使我的实现更贴近文档,我根据文档建议将我的 updatedAt 集放在实体中。

我的 set 方法如下所示:

public function setDailyChart(\Symfony\Component\HttpFoundation\File\UploadedFile $dailyChart)
{
    $this->dailyChart = $dailyChart;
        if ($dailyChart) {
            $this->updatedAt = new \DateTime('now');
        }
    return $this;
}

我明确设置了带有完整路径的类型提示。现在我收到以下错误。

AppBundle\Entity\MTI_Cart\AodTechnicalAnalysis::setDailyChart() must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile, instance of Symfony\Component\HttpFoundation\File\File given

【问题讨论】:

  • 检查您是否使用Uploadable 注释正确地注释了您的类,如here 所述。我想你做的,只是一张支票
  • 是的,我确定了...@Vich\UploadableField(mapping="aod_images", fileNameProperty="twohourChartName")。我直接从您链接到的页面中获取了其中的一部分。我只是仔细检查了我在实体上的映射是否与配置文件中的映射匹配。完美匹配。
  • /** * @ORM\Entity * @Vich\Uploadable */ 类产品

标签: symfony vichuploaderbundle


【解决方案1】:

要将此捆绑包与 symfony3 一起使用,您必须使用表单类型:VichFileType,如文档 here 中所述,例如:

// ...
use Vich\UploaderBundle\Form\Type\VichFileType;

// ...

public function buildForm(FormBuilderInterface $builder, array $options)
{
    // ...

    $builder->add('image', VichFileType::class, array(
        'required'      => false,
        'allow_delete'  => true, // not mandatory, default is true
        'download_link' => true, // not mandatory, default is true
    ));
}

所以在你的 formType 类中试试这个:

use Vich\UploaderBundle\Form\Type\VichFileType;
//..
->add('dailyChartName', VichFileType::class, array())
->add('twohourChartName', VichFileType::class, array())

希望有帮助

【讨论】:

  • 我按照您和文档的建议进行了所有更改。切换到 VichFileType::class 并引入适当的 USE 语句。我还启用了 vich 表单主题,因为您链接到的文档建议。我仍然得到相同的行为。日志文件中仍然有相同的教义消​​息,其中保存了图像的路径。在错误的地方。当我查看目录时,图像实际上并没有被移动()。
  • 我将 updateAt 代码添加到 setter 方法中,并根据文档的建议添加了类型提示,现在我收到类型错误。我没有通过我的 OP 中的编辑来处理它
  • 嗨@RickMason 我看到了你的更新。在usage 指南中,文件的方法是一个简单的 File 而不是 UploadedFile 作为您的设置器。
  • 感谢 @matteo 帮助我解决这个问题。原来我没有完全正确的文件、名称和相应的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
相关资源
最近更新 更多