gpt4 book ai didi

php - Symfony3 中带有 VichUploader 包的数据装置

转载 作者:可可西里 更新时间:2023-10-31 23:45:42 31 4
gpt4 key购买 nike

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

如何在我的 ORM 数据装置中将文件附加到该实体?


有一个question for this problem in Symfony 2我试过那个代码。 fixtures 加载没有错误,但“上传”的文件没有复制到它的最终目的地。

我可以手动完成,我最近的尝试是这样的:

<?php
// src/AppBundle/DataFixtures/ORM/LoadCourseData.php

namespace AppBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
use AppBundle\Entity\Course;

class LoadCourseData extends AbstractFixture implements OrderedFixtureInterface
{
public function load(ObjectManager $manager)
{
$course = new Course();
$course->setName('How to make data fixtures in Symfony lol')
->setAuthor($this->getReference('admin-user'))
->setSummary('You\'ll know when I know!')
->setLicense($this->getReference('cc-by'))
->setDifficulty(1);

// Persist to generate slug (to be used for uploads)
$manager->persist($course);

// Attach file

// I copy it to a temporary directory as per the Symfony2 answer
copy(__DIR__.'/../Files/kitten.jpg', '/tmp/kitten.jpg');

// These are filled in for completeness
$mimetype = MimeTypeGuesser::getInstance()->guess('/tmp/kitten.jpg');
$size = filesize('/tmp/kitten.jpg');

// Create a new UploadedFile
$file = new UploadedFile('/tmp/kitten.jpg', 'kitten.jpg', $mimetype, $size, null, true);

// I have to move it manually?
// Plus how can I take advantage of the VichUploader namer?
$file->move(__DIR__.'/../../../../web/img/upload/course/');

// Apply to entity
$course->setImageFile($file);

// Persist
$manager->persist($course);
$manager->flush();
}

public function getOrder()
{
return 4;
}
}

我的解决方案仍然需要大量工作!我是不是找错树了?

  • 上传路径已在 config.yml 中定义。我应该从那里访问它们或将它们转换为参数
  • 需要更多的错误检查和异常抛出
  • 文件已复制到目的地,但文件名错误,因为它没有使用配置的 VichUploader 命名器
  • 它应该存在于其他地方,可能作为一项服务?

最佳答案

我发现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

在我的例子中,上面的“documents”文件夹位于 web 文件夹下,因此路径是“web/documents”。我想将所有内容存储在同一个位置。

然后我在任何 Controller 中使用 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();

在上面的代码中,我正在获取“目录”文件按钮数据,即文件。然后调用指定文件和路径以及文件名参数的“上传”方法。然后稍后保留实体 ($att_cat)。

上面的使用起来很简单

关于php - Symfony3 中带有 VichUploader 包的数据装置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38769009/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com