在Symfony3中使用VichUploader捆绑的数据夹具

时间:2016-08-04 13:40:04

标签: php symfony vichuploaderbundle

一个基本的Symfony 3应用程序安装并配置了VichUploader bundle,并带有一个用于上传文件的实体。

如何在我的ORM数据夹具中将文件附加到此实体?

有一个question for this problem in Symfony 2,我尝试过该代码。夹具加载时没有错误,但“上传”文件未复制到其最终目的地。

我可以手动执行此操作,我的最新尝试如下:

config.yml

我的解决方案仍需要大量工作!我吠叫错了树吗?

  • 上传路径已在$m = new MongoClient(); $db = $m->yourDB; $collection = $db->yourCollecton; $sdate = '2016-01-01'; $sdate = '2016-01-31'; $pipeline = array( array( '$match'=>array('date'=>array('$gte'=>$sdate,'$lte'=>$edate)) ), array( '$group' => array( '_id' => array(null), 'first_field' => array('$field'), ) ) ); $cursor = $collection->aggregate($pipeline); $row = $cursor['result'][0]; 中定义。我应该从那里访问它们或将它们转换为参数
  • 需要更多错误检查和异常抛出
  • 文件被复制到目的地,但文件名错误,因为它没有使用配置的VichUploader名称
  • 它应该住在其他地方,可能是作为服务吗?

1 个答案:

答案 0 :(得分:0)

我发现GitHub上的VichUploader文档不是很好,所以我建议你使用Symfony文档: http://symfony.com/doc/current/controller/upload_file.html

我在src / AppBundle下创建了一个FileUploader.php,如下所示:

<?php

// src/AppBundle/FileUploader.php
namespace AppBundle;

use Symfony\Component\HttpFoundation\File\UploadedFile;

class FileUploader
{
    private $targetDir;

    public function __construct($targetDir)
    {
        $this->targetDir = $targetDir;
    }

    public function upload(UploadedFile $file, $path, $name)
    {
        $fileName = $name.'.'.$file->guessExtension();

        $file->move($this->targetDir.$path, $fileName);

        return $fileName;
    }
}

这允许您指定文件,路径和名称。

然后在你的app / config / service.yml文件中添加它以引用它:

services:
  app.attachment_uploader:
      class: AppBundle\FileUploader
      arguments: ['%document_directory%']

然后你需要在app / config / parameters.yml文件中指定%document_directory%:

parameters:
...
    document_directory: documents

在我的情况下,上述&#39;文件&#39;文件夹位于Web文件夹下,因此路径为“web / documents&#39;”。我想把所有东西存放在同一个地方。

然后我在任何控制器中使用FileUploader,如下所示:

...
->add('catalog', FileType::class, array(            // Docs
        'label' => 'Catalog Course Description ',
        'required' => false,
        'attr' => array(
                'accept' => 'image/*,application/pdf,text/plain,application/msword',
                'onchange' => "checkFileSize('form_catalog')"
        ),
))
...

$file = $form->get("catalog")->getData();
$fileName = $this->get('app.attachment_uploader')->upload( $file,
        '/'.$pet->getStudent()->getBanId(),
        $pet->getCourse()->getCorTitle().'_'.'Catalog_Course_Desc'
...

$att_cat->setDocument($fileName);
$em->persist($att_cat);
$em->flush();

在上面的代码中,我得到了&#34;目录&#34;文件按钮数据,即文件。然后拨打&#39;上传&#39;指定文件和路径以及文件名参数的方法。然后保持实体($ att_cat)。

以上使用非常简单。