Programmieren mit Yii2 Hochladen von Dateien

Was Sie erstellen werden

Wenn Sie fragen: "Was ist Yii?" Schauen Sie sich mein früheres Tutorial an: Einführung in das Yii-Framework, Hier werden die Vorteile von Yii beschrieben und ein Überblick über die Neuerungen in Yii 2.0 (Oktober 2014) gegeben.

In dieser Anleitung zum Programmieren mit Yii2 leite ich die Leser beim Einsatz des Yii2-Frameworks für PHP. In diesem Tutorial werde ich Sie durch die Grundlagen des Hochladens von Dateien und Bildern in Yii2 führen. 

Für diese Beispiele stellen wir uns weiterhin vor, dass wir ein Framework für die Veröffentlichung einfacher Statusaktualisierungen erstellen, z. unser eigenes Mini-Twitter. Das Bild oben zeigt das Schreiben eines kurzen Updates, während ich ein Foto des Taj Mahal hochlade.

Nur zur Erinnerung, ich beteilige mich an den Kommentarthreads unten. Ich bin besonders interessiert, wenn Sie unterschiedliche Ansätze, zusätzliche Ideen haben oder Themen für zukünftige Tutorials vorschlagen möchten. Wenn Sie eine Frage oder ein Thema haben, schreiben Sie bitte unten. Sie können mich auch direkt auf Twitter @reifman erreichen.

Plugins zum Hochladen von Dateien

Es gibt zwei Plugins für das Hochladen von Dateien für Yii2, die am robustesten erscheinen:

  1. Das FileInput-Widget von Kartik Visweswaran (oben abgebildet)
  2. Der 2Amigos BlueImp File Uploader (ein Wrapper für den BlueImp JQuery File Uploader) 

Für dieses Tutorial habe ich mich entschieden, mit Kartiks Plugin fortzufahren. Ich fand es einfacher zu bedienen und besser dokumentiert als das 2Amigos-Plugin. Der BlueImp File Uploader verfügt jedoch über einige faszinierende Benutzererfahrungsfunktionen, die Sie erkunden möchten (siehe unten):

Arbeiten mit dem FileInput-Plugin

Beginnen Sie mit der Installation und Verwendung des Datei-Uploaders und integrieren Sie ihn in unser Twitter-ähnliches Statuserstellungs-Applet. Wir verwenden wieder den Yii2 Hello-Anwendungsbaum, den Sie mit dem GitHub-Button-Link neben oder unterhalb herunterladen können.

Plugin installieren

Zuerst können wir Composer zum Hinzufügen verwenden kartik-v / yii2-widget-fileinput zu unserer Bewerbung:

$ composer erfordern kartik-v / yii2-widget-fileinput "*" ./composer.json wurde aktualisiert. Composer-Repositorys mit Paketinformationen werden geladen. Abhängigkeiten werden aktualisiert (einschließlich required-dev) - kartik-v / yii2-widget-fileinput (dev -master 36f9f49 => v1.0.4) Auschecken 36f9f493c2d814529f2a195422a8af2e020fc80c Sperrdatei schreiben Dateien werden automatisch generiert 

Erweitern der Statustabelle

Als Nächstes müssen wir Felder für die Datei hinzufügen, die wir in unsere Statustabelle hochladen möchten. In diesem Beispiel lassen wir den Benutzer ein Bild hochladen, um dessen Statusaktualisierung mitzunehmen.

Die Felder, die wir hinzufügen, betreffen den ursprünglichen Dateinamen der hochgeladenen Dateien sowie einen eindeutigen Dateinamen, der zur Anzeige auf unserem Server gespeichert wird:

  • image_src_filename
  • image_web_filename

Erstellen Sie eine neue Migration, um diese Felder zur Statustabelle hinzuzufügen:

$ ./yii migrieren / erstellen extend_status_table_for_image Yii Migration Tool (basierend auf Yii v2.0.6) Neue Migration erstellen '/Users/Jeff/Sites/hello/migrations/m160316_201654_extend_status_table_for_image.php'? (ja | nein) [nein]: ja Die neue Migration wurde erfolgreich erstellt.

Hier ist die angepasste Migration, um die beiden Felder als Zeichenfolgen hinzuzufügen:

db-> driverName === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> addColumn ('% status', 'image_src_filename', Schema :: TYPE_STRING. 'NOT NULL'); $ this-> addColumn ('% status', 'image_web_filename', Schema :: TYPE_STRING. 'NOT NULL');  public function down () $ this-> dropColumn ('% status', 'image_src_filename'); $ this-> dropColumn ('% status', 'image_web_filename'); falsch zurückgeben; 

Führen Sie dann die Migration aus:

$ ./yii migrate / up Yii Migration Tool (basierend auf Yii v2.0.6) Insgesamt 1 neu anzuwendende Migration: m160316_201654_extend_status_table_for_image Anwenden der obigen Migration? (Ja | Nein) [Nein]: Ja *** Anwenden von m160316_201654_extend_status_table_for_image> Hinzufügen der Spalte image_src_filename string NOT NULL zur Tabelle % status… done (time: 0.044s)> Hinzufügen der Spalte image_web_filename string NOT NULL zur Tabelle % status ... done (Zeit: 0.011s) *** angewendet m160316_201654_extend_status_table_for_image (Zeit: 0,071s) Erfolgreich migriert.

Da Yii2 mit einer Model View Controller (MVC) -Architektur aufgebaut ist, gibt es drei weitere Codierungsbereiche, die für den Dateiuploader implementiert werden müssen:

  1. Das Statusmodell
  2. Die Statusansicht und das Formular
  3. Der Statuscontroller

Verbesserung der Modellfunktionalität

Jetzt nehmen wir Änderungen am vor /models/Status.php Datei. In erster Linie müssen Attribute und Validierungsregeln für die neuen Bildfelder sowie für die temporären Felder bereitgestellt werden $ image Variable, die das Widget zum Hochladen der Datei verwendet.

Unten fügen wir Kommentare für die beiden neuen hinzu $ image_xxx_filename Variablen und erstellen Sie eine öffentliche temporäre Variable namens $ image:

/ ** * Dies ist die Modellklasse für die Tabelle "Status". * * @property integer $ id * @property string $ message * @property integer $ Berechtigungen * @property string $ image_src_filename * @ property string $ image_web_filename * @ property integer $ created_at * @ property integer $ updated_at * @property integer $ erstellt_by * * @ property User $ createdBy * / class Status erweitert \ yii \ db \ ActiveRecord const PERMISSIONS_PRIVATE = 10; const PERMISSIONS_PUBLIC = 20; öffentliches $ image;

Als Nächstes fügen wir Validierungsregeln für unser Image hinzu, z. B. Dateityp und maximale Größe:

public function rules () return [[['message'], 'required'], [['' message '],' string '], [[' 'permissions' ',' created_at ',' updated_at ',' created_by ']) , 'integer'], [['' image '],' safe '], [[' 'image'], 'file', 'extensions' => 'jpg, gif, png'], [['' image '], 'file', 'maxSize' => '100000'], [['' image_src_filename ',' image_web_filename '],' string ',' max '=> 255],]; 

Und neue Attributbeschriftungen für Ansichten:

 public function attributeLabels () return ['id' => Yii :: t ('app', 'ID'), 'message' => Yii :: t ('app', 'Message'), 'permissions' = > Yii :: t ('app', 'Permissions'), 'image_src_filename' => Yii :: t ('app', 'Dateiname'), 'image_web_filename' => Yii :: t ('app', 'Pfadname '),' created_by '=> Yii :: t (' app ',' Created By '),' created_at '=> Yii :: t (' app ',' Created at '),' updated_at '=> Yii: : t ('app', 'Updated At'),]; 

Jetzt können wir mit den Änderungen der Ansicht im ActiveModel-Formular fortfahren.

Hinzufügen unserer Ansichts- und Formularfunktionalität

Image-Upload in das Statuserstellungsformular integrieren

Um die Formularintegration für das Hochladen von Bildern in Statusaktualisierungen (oben dargestellt) zu ermöglichen, müssen Sie Änderungen an der /views/status/_form.php Datei. 

Zuerst schließen wir das ein kartik \ file \ FileInput Widget oben und aktualisieren Sie das Formular, um mehrteilig zu werden, was die Veröffentlichung von Dateien unterstützt:

 
['enctype' => 'multipart / form-data']])); // wichtig?>

Dann fügen Sie zwischen den Feldern Berechtigungen und Senden das FileInput-Widget hinzu:

Feld ($ model, 'permissions') -> dropDownList ($ model-> getPermissions (), ['prompt' => Yii :: t ('app', '- Wählen Sie Ihre Berechtigungen -')])?> 
Feld ($ model, 'image') -> Widget (FileInput :: classname (), ['options' => ['accept' => 'image / *']), 'pluginOptions' => ['allowedFileExtensions' => ['jpg', 'gif', 'png'], 'showUpload' => false,],]); ?>
isNewRecord? Yii :: t ('app', 'Create'): Yii :: t ('app', 'Update'), ['class' => $ model-> isNewRecord? 'btn btn-success': 'btn btn-primary'])?>

In dem PluginOptions In dieser Zeile beschränken wir die Dateitypen auf gängige Bildformate wie jpg.

Wenn der Vorgang abgeschlossen ist, sieht es ungefähr so ​​aus und wartet darauf, dass der Benutzer ein Bild hinzufügt:

Anzeigen des Bildes

Ich werde auch Code hinzufügen, um das hochgeladene Bild später anzuzeigen (nachdem wir die Controller-Unterstützung beendet haben). 

Zuerst füge ich es der Statusansicht hinzu (/views/status/view.php), was sehr einfach ist. Ich werde jedoch das Bild unter den Artikeldetails anzeigen:

 $ model, 'attributes' => ['id', 'createdBy.email', 'message: ntext', 'permissions', 'image_web_filename', 'image_src_filename', 'created_at', 'updated_at',],])? > image_web_filename! = ") echo '

'; ?>

Es wird ungefähr so ​​aussehen:

Außerdem fügen wir unserer Status-Indexseite eine kleine Miniaturansicht hinzu (/views/status/index.php). Ich habe ein benutzerdefiniertes Spaltenattribut zu Yii2s GridView-Widget hinzugefügt:

 $ dataProvider, 'filterModel' => $ searchModel, 'Spalten' => [['class' => 'yii \ grid \ SerialColumn'], 'id', 'message: ntext', 'permissions', 'created_at', ['attribute' => 'Image', 'format' => 'raw', 'value' => Funktion ($ model) if ($ model-> image_web_filename! = ") return ''; andernfalls 'no image' zurückgeben;,], ['class' => 'yii \ grid \ ActionColumn', 'template' => ' view update delete ',' buttons '=> [' view '=> Funktion ($ url, $ model) return Html :: a ('',' status / '.$ model-> slug, [' title '=> Yii :: t (' yii ',' View '),]); ],],],]); ?>

Letztendlich wird es so aussehen:

Aufbau der Controller-Unterstützung

Um all dies zu ermöglichen, müssen wir die Controller-Integration abschließen. 

Oben /controllers/StatusController.php, wir müssen einschließen yii \ web \ UploadedFile:

Dann müssen wir das aktualisieren actionCreate Funktion:

öffentliche Funktion actionCreate () $ model = new Status (); if ($ model-> load (Yii :: $ app-> request-> post ())) $ image = UploadedFile :: getInstance ($ model, 'image'); if (! is_null ($ image)) $ model-> image_src_filename = $ image-> name; $ ext = end ((explodieren (".", $ image-> name)))); // Einen eindeutigen Dateinamen generieren, um doppelte Dateinamen zu verhindern. $ model-> image_web_filename = Yii :: $ app-> security-> generateRandomString (). ". $ ext"; // Der Pfad zum Speichern der Datei. Sie können einen uploadPath // in Yii :: $ app-> params (wie im folgenden Beispiel verwendet) festlegen. Yii :: $ app-> params ['uploadPath'] = Yii :: $ app -> basePath. '/ web / uploads / status /'; $ path = Yii :: $ app-> params ['uploadPath']. $ model-> image_web_filename; $ image-> saveAs ($ path);  if ($ model-> save ()) return $ this-> redirect (['view', 'id' => $ model-> id]);  else var_dump ($ model-> getErrors ()); sterben();  return $ this-> render ('create', ['model' => $ model,]); 

Im Wesentlichen führt dies die folgenden Operationen aus:

  1. Wir erfassen den ursprünglichen Dateinamen aus den Formularinformationen der hochgeladenen Datei (image_src_filename).
  2. Wir erzeugen einen eindeutigen Dateinamen für unseren Server (image_web_filename).
  3. Wir speichern die Datei in unserem Upload-Verzeichnis (/ web / uploads / status /).
  4. Wir speichern das Modell.
  5. Wir leiten zur erweiterten Ansichtsseite weiter.

Sie können das Endergebnis mit dem Bild oben sehen, das ein Bild des Taj Mahal enthält.

Kartiks File Input Widget bietet auch erweiterte Konfigurationen, die er ziemlich gut dokumentiert, wie z. B. Drag and Drop:

Überprüfen Sie weitere davon auf den folgenden Seiten:

  • FileInput Widget Demo
  • Laden Sie eine Datei in Yii 2 mit dem FileInput-Widget hoch
  • Erweiterter Upload mit Yii2 FileInput-Widget 

Was kommt als nächstes?

Ich hoffe, das hilft Ihnen bei den Grundlagen des Dateiuploads in Ihrer Yii2-Anwendung. Wenn Sie einen weiteren ähnlichen Überblick über diese Art von Funktionalität erhalten möchten, lesen Sie den Artikel Erstellen Sie Ihr Startup mit PHP: Benutzereinstellungen, Profilbilder und Kontaktdetails. Dieses Tutorial bietet eine etwas andere Integration als dieses Tutorial, indem Registerkarten verwendet werden, Benutzerprofile aktualisiert und die Bilder skaliert werden.

Achten Sie auf kommende Tutorials in meiner How to Program With Yii2-Serie, während ich mich weiter mit den verschiedenen Aspekten des Frameworks beschäftige. Vielleicht möchten Sie auch die Serie "Erstellen Sie Ihr Startup mit PHP" ausprobieren, die die erweiterte Vorlage von Yii2 verwendet, während Sie eine reale Anwendung erstellen.

Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial ankommt, folgen Sie mir @reifman auf Twitter oder besuchen Sie meine Instructor-Seite. Meine Ausbilderseite enthält alle Artikel dieser Serie, sobald sie veröffentlicht sind. 

ähnliche Links

Hier finden Sie eine Vielzahl von Links, mit denen ich dieses Tutorial recherchierte und schrieb:

  • Yii2 Developer Exchange, meine Website für Yii2-Ressourcen
  • FileInput Widget Demo von - Kartik
  • Laden Sie eine Datei in Yii 2 mit dem FileInput-Widget - Kartik hoch
  • Code für kartik-v / yii2-widget-fileinput (GitHub)
  • BlueImp JQuery-Demo zum Hochladen von Dateien
  • Code für 2 amigos/yii2-file-upload-widget: Widget für das Hochladen von BlueImp-Dateien (Github)
  • Dateien hochladen - Das endgültige Handbuch zu Yii 2.0