5

Tôi đang cố gắng sử dụng OneupUploaderBundle để tải tệp lên. Tôi đã đọc tài liệu về gói này nhiều lần nhưng tôi không tìm thấy bất kỳ ví dụ đơn giản nào về một thực thể cho tệp được tải lên. Kỳ vọng của tôi là một định nghĩa lớp tương tự như VichUploaderBundle:Ví dụ đơn giản về tệp thực thể được tải lên với OneupUploaderBundle

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

    // ... 
} 

Hy vọng câu hỏi của tôi là rõ ràng ...

Tôi thực sự quan tâm bằng cách bó này vì nó hỗ trợ jQuery.

Cảm ơn,

+0

Tôi đoán bạn đang nói về [OneupUploaderBundle] (https://github.com/1up-lab/OneupUploaderBundle/issues/136)? – devsheeep

+0

Có ... Tôi sẽ chỉnh sửa câu hỏi của tôi ngay bây giờ! –

Trả lời

16

Không có điều gì như một thực thể được xác định trước hoặc xử lý ORM. Điều này có một số lý do. Gói này không thể thấy trước các dự án cần về logic tải lên. Nếu ai đó muốn lưu trữ tệp vào cơ sở dữ liệu hoặc không hoàn toàn là lựa chọn của riêng họ và không nên bị buộc bởi một nhóm bên thứ ba. Thứ OneUpUploaderBundle cung cấp là một phần phụ trợ cho những người tải lên giao diện người dùng phổ biến nhất.


Disclaimer: Tôi đã lùn sao chép và mở rộng an answer mà đã hiện diện trong vấn đề theo dõi GitHub của gói này. Ở đó bạn sẽ tìm thấy khá nhiều thông tin chi tiết về cách thức và lý do gói này là gì bây giờ.


Cho rằng bạn đã cài đặt một dự án Symfony2 đang hoạt động, hãy thực hiện theo installation instructions của gói này. Tôi nghĩ bước 1 và 2 không phải là vấn đề, vì vậy hãy móc trực tiếp đến bước 3, cấu hình.

Bạn đã nói, bạn đã cố gắng tích hợp jQuery File Uploader, vì vậy hãy tạo bản đồ cho nó. Mở tập tin app/config/config.yml và thêm các dòng sau vào cuối dòng.

oneup_uploader: 
    mappings: 
     gallery: 
      frontend: blueimp 

Và tất nhiên, đừng quên thêm các dòng sau vào app/config/routing.yml.

oneup_uploader: 
    resource: . 
    type: uploader 

Rất nhiều cấu hình. Để đơn giản, chúng ta sẽ thay đổi AcmeDemoBundle.

Mở tệp src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig và xóa mọi thứ giữa {% block content %}{% endblock %}. Chúng tôi không cần điều này nữa.

Bây giờ chèn như sau:

<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 /> 

Chỏ trình duyệt web của bạn vào thư mục gốc của ứng dụng này (app_dev.php). Bạn sẽ thấy một trường đầu vào giống như dự kiến ​​và bây giờ bạn có thể tải lên một số hình ảnh (ví dụ). Các tệp sẽ được lưu trữ trong web/uploads/gallery mỗi tệp có một tên tệp duy nhất. Lưu ý rằng chúng tôi đã sử dụng một số CDN để phục vụ các tệp JavaScript cần thiết cho việc này.

Tại thời điểm này, bạn đã có biểu mẫu tải lên đang hoạt động. Nhưng ngoài việc tải các tệp lên thư mục tải lên, nó cũng không có gì. Đây là nơi mà các Next step section trong tài liệu có ích.

Khi tôi hiểu câu hỏi của bạn, bạn muốn tạo một thực thể lưu trữ đường dẫn tệp của một tệp có liên quan trong đó. Để làm như vậy, hãy tạo lớp Entity của bạn bao gồm tất cả các trường bắt buộc.

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

    // ... 
} 

Sau đó tạo một EventListener như được mô tả trong the documentation của gói này.

<?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(); 
    } 
} 

Và tất nhiên đăng ký trình xử lý sự kiện của bạn.

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

Tại thời điểm này, EventListener sẽ được gọi ngay khi tệp mới được tải lên thông qua ánh xạ được định cấu hình. Phải có tệp này, tạo đối tượng mới là MotorsAdsFile và lưu trữ đường dẫn tệp đến thuộc tính filename, vẫn tiếp tục và chuyển nó tới cơ sở dữ liệu cơ bản.

Vì tôi không thể dự đoán được logic thực tế của bạn, đây là ví dụ cơ bản nhất mà tôi có thể nghĩ đến. Bạn hoàn toàn miễn phí để làm bất cứ điều gì là cần thiết trong người nghe sự kiện. (Trong trường hợp bạn cần lưu trữ đối tượng này cho một thực thể khác hoặc tương tự.)

Bạn sẽ tìm thấy một loạt các chủ đề khác trong tài liệu Next steps section. Ví dụ: cách bạn muốn change the naming strategy của các tệp đã tải lên hoặc cách enable chunked uploads trong trường hợp bạn cần tải lên các tệp lớn.

+1

Cảm ơn câu trả lời tuyệt vời @devsheeep! :) –

Các vấn đề liên quan