7

我尝试使用OneuploaderBundle上传文件。我多次阅读了这个捆绑包的文档,但我没有找到任何简单的实体示例来上传文件。我的期望是类定义类似于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。

谢谢,

4

1 回答 1

19

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


免责声明:我已经简短地复制并扩展了这个包的 GitHub 问题跟踪器中已经存在的答案。在那里,您会发现很多关于此捆绑包如何以及为何成为现在这样的见解。


鉴于您已经安装了一个可用的 Symfony2 项目,请按照此包的安装说明进行操作。我认为第 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 文件。

此时,您已经有了一个有效的上传表单。但除了将文件上传到上传目录之外,它什么也不做。这是文档中的下一步部分派上用场的地方。

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

<?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;

    // ... 
}

然后按照这个包的文档中的描述创建一个 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属性,将其持久化并刷新到底层数据库。

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

您将在文档的后续步骤部分中找到许多其他主题。例如,您将如何更改上传文件的命名策略或如何启用分块上传以防您需要上传大文件。

于 2014-10-15T09:37:52.667 回答