我正在尝试使用OneupUploaderBundle上传文件。我读了很多次这个捆绑包的文档,但没有找到任何要上传文件的实体的简单示例。我的期望是类似于VichUploaderBundle
:的类定义
<?php
namespace MinnAdsBundleEntity;
use DoctrineORMMapping as ORM;
use SymfonyComponentHttpFoundationFileFile;
use SymfonyComponentValidatorConstraints as Assert;
use VichUploaderBundleMappingAnnotation as Vich;
/**
* @ORMEntity
* @VichUploadable
*/
class MotorsAdsFile {
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @AssertFile(
* maxSize="5M",
* mimeTypes={"image/png", "image/jpeg"}
* )
* @VichUploadableField(mapping="motors_files", fileNameProperty="filename")
* note: This is not a mapped field of entity metadata, just a simple property.
* @var File $file
*/
protected $file;
/**
* @ORMColumn(type="string", length=255, name="filename")
* @var string $filename
*/
protected $filename;
/**
* @ORMColumn(type="string", length=255, name="name")
* @var string $name
*/
protected $name;
// ...
}
希望我的问题很清楚。。。
我对这个捆绑包非常感兴趣,因为它支持jQuery。
谢谢,
没有预定义的实体或ORM处理。这有几个原因。这个捆绑包无法预见上传逻辑方面的项目需求。是否有人想将文件存储到数据库完全是他们自己的选择,不应该被第三方捆绑包强迫。OneupUploaderBundle提供的是最常见的前端上传程序的后端。
免责声明:我简短地复制并扩展了这个捆绑包的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 MinnAdsBundleEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity
*/
class MotorsAdsFile {
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @ORMColumn(type="string", length=255, name="filename")
* @var string $filename
*/
protected $filename;
// ...
}
然后创建一个EventListener,如该捆绑包文档中所述。
<?php
namespace AcmeHelloBundleEventListener;
use OneupUploaderBundleEventPostPersistEvent;
use MinnAdsBundleEntityMotorsAdsFile;
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="AcmeHelloBundleEventListenerUploadListener">
<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
属性,持久化并将其刷新到底层数据库。
由于我无法预测你的实际逻辑,这是我能想到的最基本的例子。当然,您可以自由地在事件侦听器中执行任何需要的操作。(如果您需要将此对象存储到另一个实体或类似实体。)
您将在文档的"下一步"部分中找到一系列其他主题。例如,如何更改上传文件的命名策略,或者在需要上传大文件时如何启用分块上传。