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.
Ich denke, Sie sprechen über die [OneupUploaderBundle] (https://github.com/1up-lab/OneupUploaderBundle/issues/136)? – devsheeep
Ja ... Ich werde meine Frage jetzt bearbeiten! –