5

Ich versuche OneupUploaderBundle zum Hochladen von Dateien zu verwenden. Ich habe die Dokumentation dieses Pakets viele Male gelesen, aber ich habe kein einfaches Beispiel für eine Entität für die Datei gefunden, die hochgeladen werden kann. Meine Erwartung ist, eine Klassendefinition ähnlich dem VichUploaderBundle:Einfaches Beispiel der Entitätsdatei, die mit OneupUploaderBundle hochgeladen werden soll

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

    // ... 
} 

Hoffnung meine Frage klar ist ...

Ich bin wirklich daran interessiert, dieses Bündel, da es jQuery unterstützt.

Danke,

+0

Ich denke, Sie sprechen über die [OneupUploaderBundle] (https://github.com/1up-lab/OneupUploaderBundle/issues/136)? – devsheeep

+0

Ja ... Ich werde meine Frage jetzt bearbeiten! –

Antwort

16

Es gibt so etwas wie eine vorgegebene Einheit oder ORM-Handling-Nr. Dies hat mehrere Gründe. Dieses Paket kann die Anforderungen des Projekts hinsichtlich der Upload-Logik nicht vorhersehen. Wenn jemand Dateien in der Datenbank speichern möchte oder nicht, ist völlig seine eigene Wahl und sollte nicht von einem Drittanbieter-Paket erzwungen werden. Das OneupUploaderBundle bietet ein Backend für die gängigsten Frontend-Uploader.


Haftungsausschluss: Ich habe shorty kopiert und erweitert an answer, die in der GitHub issue tracker dieses Bündels bereits vorhanden war. Dort finden Sie viele Einsichten darüber, wie und warum dieses Paket so ist, wie es jetzt ist.


Da Sie bereits ein funktionierendes Symfony2 Projekt installiert haben, folgen Sie dem installation instructions des Bundles. Ich denke, Schritt 1 und 2 sollten kein Problem sein, also lasst uns direkt an Schritt 3, die Konfiguration, haken.

Sie sagten, Sie haben versucht, die jQuery File Uploader zu integrieren, also erstellen wir eine Zuordnung für sie. Öffnen Sie die Datei app/config/config.yml und fügen Sie am Ende die folgenden Zeilen hinzu.

oneup_uploader: 
    mappings: 
     gallery: 
      frontend: blueimp 

Und natürlich nicht zu vergessen die folgenden Zeilen zu app/config/routing.yml hinzuzufügen.

oneup_uploader: 
    resource: . 
    type: uploader 

So viel für die Konfiguration. Der Einfachheit halber werden wir das AcmeDemoBundle ändern.

Öffnen Sie die Datei src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig und löschen Sie alles zwischen {% block content %} und {% endblock %}. Das brauchen wir nicht mehr.

Fügen Sie nun folgendes:

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

mit Ihrem Browser in das Stammverzeichnis der Anwendung (app_dev.php). Sie sehen ein Eingabefeld genau wie erwartet und Sie können jetzt einige Bilder hochladen (zum Beispiel). Die Dateien werden in web/uploads/gallery jede einzelne mit einem eindeutigen Dateinamen gespeichert. Beachten Sie, dass wir einige CDNs verwendet haben, um die dafür benötigten JavaScript-Dateien bereitzustellen.

An dieser Stelle haben Sie bereits ein funktionierendes Upload-Formular. Aber außer das Hochladen von Dateien in das Upload-Verzeichnis tut es nichts. Hier kommt die Next step section in der Dokumentation zum Einsatz.

Wie ich Ihre Frage verstehe, möchten Sie eine Entität erstellen, die einen Dateipfad einer verwandten Datei darin speichert. Um dies zu tun, erstellen Sie Ihre Entity-Klasse einschließlich aller erforderlichen Felder.

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

    // ... 
} 

Dann einen Eventlistener erstellen, wie in the documentation dieses Bündels beschrieben.

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

Und natürlich registrieren Sie Ihre Veranstaltung Listener.

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

An diesem Punkt der EventListener wird, sobald eine neue Datei über den konfigurierten Mapping hochgeladen wurde aufgerufen werden. Es dauert diese Datei, erstellt ein neues Objekt MotorsAdsFile und speichert den Dateipfad zu der filename-Eigenschaft, persistent und löscht es in der zugrunde liegenden Datenbank.

Da ich Ihre tatsächliche Logik nicht vorhersagen kann, ist dies das grundlegendste Beispiel, das ich mir vorstellen kann. Natürlich können Sie im Event-Listener alles tun, was Sie benötigen. (Für den Fall, dass Sie dieses Objekt an eine andere Entität oder ähnliches speichern müssen.)

Sie finden eine Reihe anderer Themen in der Next steps section der Dokumentation. Zum Beispiel, wie Sie change the naming strategy der hochgeladenen Dateien oder wie enable chunked uploads für den Fall, dass Sie große Dateien hochladen müssen.

+1

Danke für die tolle Antwort @devsheeep! :) –

Verwandte Themen