Upload von Symfony2-Dateien Schritt für Schritt
Ich bin immer noch lernen, Symfony2 und verstehe nicht, wie das hochladen einer Datei.
Mach dir keine sorgen, ich habe schon überprüft die Dokumentation. Es ist wirklich gut, aber mein problem ist nicht erklärt in jedem tutorial.
Ich bin auf der Suche nach Anleitung zum hochladen einer Datei mit Symfony2 aber mit der ganzen Sache, die jeder braucht (wie Einschränkung der Erweiterung, umbenennen der Datei basierend auf der id und Sachen, speichern Sie den Pfad in der db, etc...)
Fand ich gute tutorials, versuchte, vermischt Sie aber mit keinen Erfolg. Jedes mal ein anderes problem erscheint: die Datei re-uploads auf jedem Absenden des Formulars (auch wenn die Datei-Feld ist leer), guessExtension unmöglich, verwendet, tmp-Pfad in der Datenbank gespeichert, anstatt den rechten Pfad, Datei nicht verschoben, unmöglich, verwendet die id in das umbenennen, weil die id auf auto-increment und so noch nicht erzeugt).
So, ich ziehe mir eine "standard" - Entität, sagen wir: Photo.php
/**
* Photo
*
* @ORM\Table(name="photo")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class Photo
{
//Annotation for the id and auto increment etc
private $id;
/**
* @var string
* @Assert\File( maxSize = "3072k", mimeTypesMessage = "Please upload a valid Image")
* @ORM\Column(name="image", type="string", length=245, nullable=false)
*/
private $image
private $title
private $description
//all the function get, set for the 4 previous variables
}
und der controller:
public function addPhotoAction()
{
$add_photo = new Photo;
$formBuilderPhoto = $this->createFormBuilder($add_photo);
$formBuilderPhoto
->add('title','text',array('label' => 'Title of the photo', 'required' => true))
->add('image','file', array('required' => true, 'data_class' => null))
->add('description','textarea',array('label' => 'Description of your photo', 'required' => false))
;
$form_photo = $formBuilderPhoto->getForm();
if ($request->getMethod() == 'POST') {
$form_photo->bind($request);
if ($form_photo->isValid()) {
//...
}
}
return $this->render('MyBundle:frontend:photo.html.twig',
array('form_photo' => $form_photo->createView())
);
}
Weißt du jetzt, was sind die 'wichtige' Funktion hinzufügen, um der Lage sein, um das Foto hochzuladen und es umbenennen ?
Wie überprüfen Sie die Erweiterung, um zu sehen, ob der upload möglich ist?
Was ist Ihre tatsächliche Art und Weise zu tun, so eine Sache mit Symfony2? Ich weiß, es gibt eine Menge von Bundles, die all die Dinge tun für Sie, aber ich möchte lernen, es zu tun und zu verstehen, den Prozess.
Was ist die 'klassische' Weise zu implementieren, die eine Datei-upload-Formular, und benennen Sie die Funktion mit Symfony2?
InformationsquelleAutor der Frage Tyrael | 2013-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen die offizielle Dokumentation auf, wie dies zu tun. Es gibt gut funktionierende Beispiele für einen einfachen Datei-upload. Überprüfen Sie auch die Lehre Dokumentation für lifecycle callbacks.
Gibt es einige HTML-Formular-Validierung in jedem browser. Sehen diese Frage für die HTML -
accept=""
Attribut ininput
Elemente. Auch in Symfony2 können Sie geben Sie den MIME-Typ der hochzuladenden Datei mit dieser annotation:Obwohl Sie nicht verwenden möchten, werden alle bundles, ich werde Ihnen empfehlen, das KnpDoctrineBehavioursBundle das macht das hochladen von Dateien viel einfacher.
Step-by-step:
Weil Sie die Dokumentation Lesen, die bereits werde ich Ihnen eine Schritt für Schritt code-Beispiel.
Zunächst benötigen Sie ein Unternehmen. Nennen wir es
Image
:Hinweis: die
@ORM\HasLifecycleCallbacks
annotation. Es ist sehr wichtig, und Sie brauchen es später. Wir erstellen alle grundlegenden Bereichen wieID
ist und was nicht. Außerdem brauchen wir ein Feld zum speichern der Datei-Pfad, in:Und eine für das Bild selbst. Hier definieren wir die Validierung für die Bilder. In meinem Beispiel hat es zu
5M
groß und von einer der angegebenenmimeTypes
. Es sollte selbsterklärend sein. Ansonsten ist die offiziellen docs helfen, wie immer.Fügen Sie alle
Getters & Setters
und aktualisieren Sie Ihre Datenbank-schema mit diesem Befehl:Als Nächstes müssen wir die Lebenszyklen. Sie sind Methoden, die in der
Entity
genannt werden, die auf bestimmte Ereignisse. Zum Beispiel die@ORM\PreUpdate()
Anmerkung, bevor eine Methode, sagt, dass diese Methode aufgerufen wird, ist rechts, bevor die Entität aktualisiert wird.Bevor der entity gespeichert oder aktualisiert, wird diese Methode aufgerufen. Sie können es verwenden, um z.B. generieren einer eindeutigen Dateinamen.
Aufgerufen, bevor die Einheit wieder entfernt werden. Dies gibt Ihnen Zeit, um zu löschen Sie das Bild aus Ihrem Ordner oder melden Sie eine Nachricht, wenn Sie möchten.
Dies ist der wichtige Teil, wo Sie Ihre Datei tatsächlich verschoben ins richtige Verzeichnis. Beachten Sie, dass ich habe einige zusätzliche Methoden. Sie können alle bekommen Sie von den offiziellen docs.
Nächste, was Sie brauchen, ist eine form. Die form-Klasse selbst ist sehr simpel. So stellen Sie sicher, legen Sie die Standard -
data_class
wie diese:Einem Datei-upload Feld kann erstellt werden, sehr leicht in den
buildForm()
Methode:Methoden für Ihre
Controller
sind ein wenig lang für einfach einfügen, die Ihnen hier und IMHO es ist nicht Teil der Beantwortung Ihrer Frage. Es gibt unzählige Beispiele gibt für das schreiben eines richtigenController Action
für Ihren Zweck.Mehr Dinge, die Sie müssen im Hinterkopf behalten:
app
schreiben Berechtigungen für den Ordner Sie die Dateien hochladen. Obwohl es scheint offensichtlich, es kann lästig sein, wenn Sie auf mehreren Servern führen Sie die Anwendung auf.Image Constraint
für Ihr Unternehmen als gut. Sie finden es hier. Aber da waren Sie reden über eine Datei hochladen, die ich verwendet, dieFile Constraint
statt.Edit:
DoctrineExtensionsBundle
zuDoctrineBehaviours
da die Entwicklung auf dem alten aufgehört zugunsten derDoctrineBehaviours
bundle.InformationsquelleAutor der Antwort ferdynator
Empfehle ich Ihnen,vlabs media bundle.
InformationsquelleAutor der Antwort Sidali Hallak
Den VichUploaderBundle ist auch einfach, um zum hochladen von Dateien:
https://github.com/dustin10/VichUploaderBundle
InformationsquelleAutor der Antwort Tim Hovius