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 %}
và {% 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.
Tôi đoán bạn đang nói về [OneupUploaderBundle] (https://github.com/1up-lab/OneupUploaderBundle/issues/136)? – devsheeep
Có ... Tôi sẽ chỉnh sửa câu hỏi của tôi ngay bây giờ! –