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.
Chyba mówisz o [OneupUploaderBundle] (https://github.com/1up-lab/OneupUploaderBundle/issues/136)? – devsheeep
Tak ... Będę teraz edytować moje pytanie! –