5

Próbuję użyć OneupUploaderBundle do przesyłania plików. Czytałem dokumentację tego pakietu wiele razy, ale nie udało mi się znaleźć żadnego prostego przykładu obiektu do przesłania pliku. Moje oczekiwanie jest definicja klasy podobny do VichUploaderBundle:Prosty przykład pliku encji do przesłania za pomocą 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; 

    // ... 
} 

nadzieję, że moje pytanie jest jasne ...

Jestem bardzo zainteresowany o tym pakiecie, ponieważ obsługuje jQuery.

Dzięki,

+0

Chyba mówisz o [OneupUploaderBundle] (https://github.com/1up-lab/OneupUploaderBundle/issues/136)? – devsheeep

+0

Tak ... Będę teraz edytować moje pytanie! –

Odpowiedz

16

Nie ma czegoś takiego jak predefiniowane podmiotowi lub ORM-manipulacji. Ma to kilka powodów. Ten pakiet nie może przewidywać potrzeb projektów pod względem logiki przesyłania. Jeśli ktoś chce przechowywać pliki w bazie danych, to jest to całkowicie ich własny wybór i nie powinien być wymuszany przez pakiet osób trzecich. To, co zapewnia OneupUploaderBundle, jest backendem dla najpopularniejszych uploaderów frontendowych.


Zastrzeżone: Mam Shorty kopiowane i rozszerzony an answer który był już obecny w emisyjnej trackera GitHub tego pakietu. Znajdziesz tam wiele informacji na temat tego, jak i dlaczego ten pakiet jest teraz tym, czym jest teraz.


Zakładając, że masz już zainstalowany roboczy projekt Symfony2, podążać za installation instructions w tym pakiecie. Myślę, że kroki 1 i 2 nie powinny stanowić problemu, więc przejdźmy bezpośrednio do kroku 3, konfiguracji.

Powiedziałeś, że próbujesz zintegrować jQuery File Uploader, więc pozwala utworzyć dla niego mapowanie. Otwórz plik app/config/config.yml i dodaj następujące linie na końcu.

oneup_uploader: 
    mappings: 
     gallery: 
      frontend: blueimp 

I oczywiście, nie zapomnij dodać następujące linie do app/config/routing.yml.

oneup_uploader: 
    resource: . 
    type: uploader 

Tyle dla konfiguracji. Dla uproszczenia zmienimy AcmeDemoBundle.

Otwórz plik src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig i usuń wszystko między {% block content %} i {% endblock %}. Już tego nie potrzebujemy.

Teraz wstawić następujący:

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

skieruj swoją przeglądarkę do katalogu głównego tej aplikacji (app_dev.php). Zobaczysz pole wprowadzania tak, jak powinno, i możesz teraz przesłać niektóre obrazy (na przykład). Pliki będą przechowywane pod numerem web/uploads/gallery z unikalną nazwą pliku. Zauważ, że użyliśmy niektórych CDN do obsługi plików JavaScript potrzebnych do tego.

W tym momencie masz już działający formularz przesyłania. Ale oprócz przesyłania plików do katalogu uploads, nie robi nic. Tutaj przydaje się dokument Next step section w dokumentacji.

Jak rozumiem Twoje pytanie, chcesz utworzyć encję, która przechowuje ścieżkę pliku powiązanego pliku. Aby to zrobić, utwórz klasę jednostek, w tym wszystkie wymagane pola.

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

    // ... 
} 

Następnie utworzyć obsługi zdarzenia, jak opisano w the documentation tego pakietu.

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

I oczywiście zarejestruj słuchacza wydarzeń.

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

W tym momencie EventListener zostanie wywołana, gdy tylko nowy plik został przesłany przez skonfigurowanego mapowania. Wykonuje ten plik, tworzy nowy obiekt o numerze MotorsAdsFile i przechowuje ścieżkę pliku do właściwości filename, trwa i spłukuje ją do bazowej bazy danych.

Ponieważ nie mogę przewidzieć twojej faktycznej logiki, jest to najbardziej podstawowy przykład, jaki mogę wymyślić. Oczywiście możesz słuchać wszystkiego, co jest potrzebne w słuchającym wydarzeniu. (W przypadku, gdy musisz przechowywać ten obiekt w innej jednostce lub podobnym.)

Znajdziesz wiele innych tematów w dokumentacji Next steps section. Na przykład, jak możesz change the naming strategy z przesłanych plików lub jak enable chunked uploads na wypadek konieczności przesyłania dużych plików.

+1

Dzięki za wspaniałą odpowiedź @devsheeep! :) –

Powiązane problemy