gpt4 book ai didi

symfony - 使用 OneupUploaderBundle 上传实体文件的简单示例

转载 作者:行者123 更新时间:2023-12-04 13:13:30 25 4
gpt4 key购买 nike

我正在尝试使用 OneupUploaderBundle用于上传文件。我多次阅读了这个包的文档,但我没有找到任何简单的实体示例来上传文件。我的期望是一个类似于 VichUploaderBundle 的类定义:

<?php

namespace Minn\AdsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Validator\Constraints as Assert;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
* @ORM\Entity
* @Vich\Uploadable
*/
class MotorsAdsFile {

/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;

/**
* @Assert\File(
* maxSize="5M",
* mimeTypes={"image/png", "image/jpeg"}
* )
* @Vich\UploadableField(mapping="motors_files", fileNameProperty="filename")
* note: This is not a mapped field of entity metadata, just a simple property.
* @var File $file
*/
protected $file;

/**
* @ORM\Column(type="string", length=255, name="filename")
* @var string $filename
*/
protected $filename;

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

// ...
}

希望我的问题很清楚...

我对这个包很感兴趣,因为它支持 jQuery。

谢谢,

最佳答案

没有预定义实体或 ORM 处理之类的东西。这有几个原因。这个bundle无法预见项目在上传逻辑方面的需求。如果有人想将文件存储到数据库中,完全是他们自己的选择,不应由第三方捆绑软件强制。 OneupUploaderBundle 提供的东西是最常见的前端上传器的后端。

免责声明:我已经复制并扩展了 an answer这已经存在于这个包的 GitHub 问题跟踪器中。在那里你会发现很多关于这个包是如何以及为什么现在是这样的见解。

鉴于您已经安装了一个可用的 Symfony2 项目,请遵循 installation instructions这个包的。我认为第1步和第2步应该没有问题,所以让我们直接钩到第3步,配置。

你说,你尝试整合jQuery File Uploader ,所以让我们为它创建一个映射。
打开文件 app/config/config.yml并将以下几行添加到它的末尾。

oneup_uploader:
mappings:
gallery:
frontend: blueimp

当然,不要忘记将以下行添加到 app/config/routing.yml .
oneup_uploader:
resource: .
type: uploader

配置就这么多。为简单起见,我们将更改 AcmeDemoBundle。

打开文件 src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig并删除 {% block content %} 之间的所有内容和 {% endblock %} .我们不再需要这个了。

现在插入以下内容:
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="https://rawgithub.com/blueimp/jQuery-File-Upload/master/js/vendor/jquery.ui.widget.js"></script>
<script type="text/javascript" src="https://rawgithub.com/blueimp/jQuery-File-Upload/master/js/jquery.iframe-transport.js"></script>
<script type="text/javascript" src="https://rawgithub.com/blueimp/jQuery-File-Upload/master/js/jquery.fileupload.js"></script>

<script type="text/javascript">
$(document).ready(function() {
$('#fileupload').fileupload({});
});
</script>

<input id="fileupload" type="file" name="files[]" data-url="{{ oneup_uploader_endpoint('gallery') }}" multiple />

将浏览器指向此应用程序的根目录 (app_dev.php)。您将看到一个与预期一样的输入字段,您现在可以上传一些图像(例如)。文件将存储在 web/uploads/gallery每一个都有一个唯一的文件名。请注意,我们使用了一些 CDN 来提供所需的 JavaScript 文件。

此时,您已经有了一个有效的上传表单。但是除了将文件上传到uploads目录之外,它什么都不做。
这是 Next step section的地方在文档中派上用场。

据我了解您的问题,您想创建一个实体,在其中存储相关文件的文件路径。
为此,请创建包含所有必填字段的实体类。
<?php

namespace Minn\AdsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
*/
class MotorsAdsFile {

/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @ORM\Column(type="string", length=255, name="filename")
* @var string $filename
*/
protected $filename;

// ...
}

然后按照 the documentation 中的描述创建一个 EventListener这个捆绑。
<?php

namespace Acme\HelloBundle\EventListener;

use Oneup\UploaderBundle\Event\PostPersistEvent;
use Minn\AdsBundle\Entity\MotorsAdsFile;

class UploadListener
{
protected $manager;

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

public function onUpload(PostPersistEvent $event)
{
$file = $event->getFile();

$object = new MotorsAdsFile();
$object->setFilename($file->getPathName());

$this->manager->persist($object);
$this->manager->flush();
}
}

当然,注册您的事件监听器。
<services>
<service id="acme_hello.upload_listener" class="Acme\HelloBundle\EventListener\UploadListener">
<argument type="service" id="doctrine.orm.entity_manager" />
<tag name="kernel.event_listener" event="oneup_uploader.post_persist" method="onUpload" />
</service>
</services>

此时 EventListener将在通过配置的映射上传新文件后立即调用。
它需要这个文件,创建一个新对象 MotorsAdsFile并将文件路径存储到 filename属性,将其持久化并将其刷新到基础数据库。

由于我无法预测您的实际逻辑,这是我能想到的最基本的示例。您当然可以自由地在事件监听器中执行任何需要的操作。 (如果您需要将此对象存储到另一个实体等。)

您会在 Next steps section 中找到许多其他主题。的文档。例如你如何 change the naming strategy上传的文件或如何 enable chunked uploads如果您需要上传大文件。

关于symfony - 使用 OneupUploaderBundle 上传实体文件的简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26341843/

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