Ami*_*uli 6 file-upload symfony jquery-file-upload oneupuploaderbundle
我尝试使用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;
// ...
}
Run Code Online (Sandbox Code Playgroud)
希望我的问题很明确......
由于它支持jQuery,我对此捆绑包非常感兴趣.
谢谢,
dev*_*eep 18
没有预定义实体或ORM处理这样的东西.这有几个原因.该捆绑包无法预见项目在上传逻辑方面的需求.如果有人想要将文件存储到数据库中,则完全是他们自己的选择,不应该被第三方捆绑包强制使用.OneupUploaderBundle提供的东西是最常见的前端上传者的后端.
免责声明:我已经复制并扩展了一个已经存在于此捆绑包的GitHub问题跟踪器中的答案.在那里你会发现很多关于这个捆绑包现在如何以及为什么的见解.
鉴于您已经安装了一个正在运行的Symfony2项目,请按照此捆绑包的安装说明进行操作.我认为第1步和第2步不应该是一个问题,所以让我们直接挂钩第3步,即配置.
你说,你试图集成jQuery File Uploader,所以让我们为它创建一个映射.打开文件app/config/config.yml并在其末尾添加以下行.
oneup_uploader:
mappings:
gallery:
frontend: blueimp
Run Code Online (Sandbox Code Playgroud)
当然,不要忘记添加以下行app/config/routing.yml.
oneup_uploader:
resource: .
type: uploader
Run Code Online (Sandbox Code Playgroud)
这么多的配置.为简单起见,我们将改变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 />
Run Code Online (Sandbox Code Playgroud)
将浏览器指向此应用程序的根目录(app_dev.php).您将看到一个与预期相似的输入字段,您现在可以上传一些图像(例如).这些文件将以web/uploads/gallery唯一的文件名存储在每个文件中.请注意,我们使用了一些CDN来提供此所需的JavaScript文件.
此时,您已经有了一个可用的上传表单.但除了将文件上传到uploads目录外,它什么也没做.这是文档中的下一步部分派上用场的地方.
据我了解您的问题,您希望创建一个实体,用于存储相关文件的文件路径.为此,请创建包含所有必填字段的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;
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后按照此捆绑包的文档中所述创建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();
}
}
Run Code Online (Sandbox Code Playgroud)
当然还要注册您的事件监听器.
<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>
Run Code Online (Sandbox Code Playgroud)
此时EventListener,只要通过配置的映射上载新文件,就会调用它.它接受此文件,创建新对象MotorsAdsFile并将文件路径存储到filename属性,并将其保留并刷新到底层数据库.
由于我无法预测你的实际逻辑,这是我能想到的最基本的例子.您当然可以自由地在事件监听器中执行任何操作.(如果您需要将此对象存储到另一个实体等.)
您可以在文档的" 后续步骤"部分找到许多其他主题.例如,如果您需要上传大文件,您将如何更改上传文件的命名策略或如何启用分块上传.
| 归档时间: |
|
| 查看次数: |
7883 次 |
| 最近记录: |