Dateien mit AJAX hochladen

Ich scheine nicht das Ende des Spaßes zu erreichen, den Sie mit aufkommenden Webtechnologien machen können. Heute zeige ich Ihnen, wie Sie etwas tun können, was bis vor kurzem fast beispiellos war: Hochladen von Dateien über AJAX.

Sicher, es gab Hacks. Aber wenn Sie wie ich sind und sich jedes Mal schmutzig fühlen, wenn Sie tippen iframe, Das wird dir sehr gefallen. Komm mit mir nach dem Sprung!

Suchen Sie nach einer schnellen Lösung?

Wenn Sie nach einer schnellen Lösung suchen, finden Sie bei Envato Market eine großartige Sammlung von Datei-Upload-Skripts und -Anwendungen

Diese HTML5-Datei ist besonders einfach - Sie können Dateien ganz einfach hinzufügen, indem Sie sie per Drag & Drop ziehen oder auf klicken. Alle Dateien werden über AJAX hochgeladen oder können innerhalb eines Formulars hinzugefügt werden. Dateien können vor dem Hochladen umbenannt werden. Eine großartige, schnelle Lösung, wenn Sie danach suchen!


Warum bekommen wir die schlechten Nachrichten nicht mit?

Dies funktioniert nicht in jedem Browser. Mit einigen progressiven Verbesserungen (oder was auch immer das aktuelle Schlagwort ist), haben wir eine Upload-Seite, die direkt in den IE6 funktioniert (allerdings ohne die AJAXy-Bits)..

Unser AJAX-Upload funktioniert solange Formulardaten ist verfügbar; Andernfalls erhält der Benutzer einen normalen Upload.

Unser Projekt besteht aus drei Hauptkomponenten.

  • Das mehrere Attribut für die Datei Eingang Element.
  • Das FileReader Objekt aus der neuen Datei-API.
  • Das Formulardaten Objekt von XMLHttpRequest2.

Wir nehmen das mehrere Attribut, mit dem der Benutzer mehrere Dateien für den Upload auswählen kann (das Hochladen mehrerer Dateien funktioniert auch dann normal, wenn Formulardaten ist nicht verfügbar). Wie du sehen wirst, FileReader erlaubt es uns, den Benutzern Miniaturansichten der hochzuladenden Dateien anzuzeigen (wir erwarten Bilder).

Keine der drei Funktionen funktioniert in IE9, daher erhalten alle IE-Benutzer eine normale Upload-Erfahrung (obwohl ich die Unterstützung für 'FileReader' in IE10 Dev Preview 2 verstehe).. FileReader funktioniert in der neuesten Version von Safari (5.1) nicht, daher werden die Miniaturansichten nicht angezeigt. Sie erhalten jedoch den AJAX-Upload und die Bestätigungsnachricht. Schließlich hat Opera 10.50 FileReader Unterstützung aber nicht Formulardaten Unterstützung, so erhalten sie Thumbnails, aber normale Uploads.

Lassen Sie uns die Codierung machen!


Schritt 1: Markup und Styling

Beginnen wir mit einigen grundlegenden Markierungen und Stylings. Natürlich ist dies nicht der Hauptteil dieses Tutorials. Ich werde Sie nicht wie einen Neuling behandeln.

Das HTML

    HTML5-Datei-API    

Laden Sie Ihre Bilder hoch

Ziemlich einfach, wie? Wir haben ein Formular, in das geschrieben wird upload.php, das werden wir in einem zweiten und einem einzigen Eingabeelement des Typs betrachten Datei. Beachten Sie, dass es das Boolean hat mehrere Attribut, mit dem der Benutzer mehrere Dateien gleichzeitig auswählen kann.

Das ist wirklich alles, was man hier sehen kann. Lass uns weitermachen.

Das CSS

body font: 14px / 1,5 helvetica-neue, helvetica, arial, san serif; Polsterung: 10px;  h1 margin-top: 0;  #main width: 300px; Marge: auto; Hintergrund: #ececec; Polsterung: 20px; Rahmen: 1px fest #ccc;  # image-list list-style: none; Marge: 0; Polsterung: 0;  # image-list li background: #fff; Rahmen: 1px fest #ccc; Text ausrichten: Mitte; Polsterung: 20px; Rand unten: 19px;  # image-list li img width: 258px; vertikal ausrichten: Mitte; Grenze: 1px fest # 474747; 

Absolut keine Schocker hier.


Schritt 2: Das PHP

Wir müssen auch in der Lage sein, die Datei-Uploads am Backend zu handhaben.

upload.php

 $ error) if ($ error == UPLOAD_ERR_OK) $ name = $ _FILES ["images"] ["name"] [$ key]; move_uploaded_file ($ _FILES ["images"] ["tmp_name"] [$ key], "uploads /". $ _FILES ['images'] ['name'] [$ key]);  Echo "

Bilder wurden erfolgreich hochgeladen

";

Bedenken Sie, dass dies die ersten PHP-Zeilen waren, die ich in einem Jahr geschrieben hatte (ich bin ein Ruby-Typ). Sie sollten wahrscheinlich etwas mehr für die Sicherheit tun; Wir stellen jedoch lediglich sicher, dass keine Upload-Fehler vorliegen. Wenn dies der Fall ist, verwenden wir das eingebaute move_uploaded_file um es zu verschieben Uploads Mappe. Vergessen Sie nicht, sicherzustellen, dass der Ordner beschreibbar ist.

Wir sollten also jetzt ein funktionierendes Upload-Formular haben. Sie wählen ein Bild (mehrere, wenn Sie möchten und Ihr Browser lässt Sie), klicken Sie auf ?Daten hochladen!? und Sie erhalten die Nachricht ?Bilder wurden erfolgreich hochgeladen.?

So sieht unser Mini-Projekt bisher aus:

Aber komm schon, es ist 2011: Wir wollen mehr als das. Sie werden feststellen, dass wir jQuery und eine upload.js Datei. Lass uns das jetzt aufbrechen.


Schritt 3: Das JavaScript

Vergeuden wir keine Zeit: Hier geht es los!

(function () var input = document.getElementById ("images"), formdata = false; if (window.FormData) formdata = neue FormData (); document.getElementById ("btn"). style.display = "keine "; ();

Hier beginnen wir mit. Wir erstellen zwei Variablen: Eingang ist unser Dateieingabeelement; Formulardaten wird verwendet, um die Bilder an den Server zu senden, wenn der Browser dies unterstützt. Wir initialisieren es mit falsch und prüfen Sie dann, ob der Browser dies unterstützt Formulardaten; Wenn ja, erstellen wir ein neues Formulardaten Objekt. Wenn wir die Bilder mit AJAX einreichen können, brauchen wir keine Bilder hochladen! Taste, damit wir es verstecken können. Warum brauchen wir es nicht? Nun, wir werden die Bilder automatisch magisch hochladen, nachdem der Benutzer sie ausgewählt hat.

Der Rest des JavaScript wird in Ihre anonyme selbstaufrufende Funktion übernommen. Als nächstes erstellen wir eine kleine Hilfsfunktion, die die Bilder anzeigt, sobald der Browser sie hat:

Funktion showUploadedItem (source) var list = document.getElementById ("image-list"), li = document.createElement ("li"), img = document.createElement ("img"); img.src = Quelle; li.appendChild (img); list.appendChild (li); 

Die Funktion benötigt einen Parameter: die Bildquelle (wir werden sehen, wie wir das bald bekommen). Dann finden wir einfach die Liste in unserem Markup und erstellen ein Listenelement und ein Bild. Wir setzen die Bildquelle auf die Quelle, die wir erhalten haben, fügen das Bild in das Listenelement und das Listenelement in die Liste ein. Voila!

Als Nächstes müssen wir die Bilder tatsächlich aufnehmen, anzeigen und hochladen. Wie gesagt, machen wir das, wenn die bei Änderung Ereignis wird auf das Eingabeelement ausgelöst.

if (input.addEventListener) input.addEventListener ("change", Funktion (evt) var i = 0, len = this.files.length, img, Leser, Datei; document.getElementById ("response"). innerHTML = "Hochladen?" Für (; i < len; i++ )  file = this.files[i]; if (!!file.type.match(/image.*/))    , false); 

Wir müssen uns nicht um das proprietäre Ereignismodell von IE kümmern, da IE9 + die standardmäßige addEventListener-Funktion unterstützt.

Es gibt noch mehr, aber fangen wir damit an. Erstens müssen wir uns nicht um das proprietäre Ereignismodell von IE kümmern, da IE9 + den Standard unterstützt addEventListener Funktion (und IE9 und Down unterstützen unsere neuen Funktionen nicht).

Was möchten wir also tun, wenn der Benutzer Dateien ausgewählt hat? Zunächst erstellen wir einige Variablen. Das einzig Wichtige ist jetzt len = this.files.length. Auf die vom Benutzer ausgewählten Dateien kann über das Objekt zugegriffen werden diese Dateien. Im Moment beschäftigen wir uns nur mit dem Länge Eigenschaft, so dass wir die Dateien durchlaufen können?

? genau das tun wir als nächstes. In unserer Schleife setzen wir die aktuelle Datei auf Datei für einen einfachen Zugang. Als Nächstes bestätigen wir, dass es sich bei der Datei um ein Bild handelt. Wir können dies tun, indem wir das vergleichen Art Eigenschaft mit einem regulären Ausdruck. Wir suchen einen Typ, der mit? Image? Beginnt. und es folgt etwas. (Der Doppelknopf vorne konvertiert das Ergebnis einfach in einen booleschen Wert.)

Was machen wir also, wenn wir ein Bild in unseren Händen haben??

if (window.FileReader) reader = new FileReader (); reader.onloadend = function (e) showUploadedItem (e.target.result); ; reader.readAsDataURL (Datei);  if (formdata) formdata.append ("images []", Datei); 

Wir prüfen, ob der Browser das Erstellen unterstützt FileReader Objekte. Wenn dies der Fall ist, erstellen wir einen.

So verwenden wir a FileReader Objekt: Wir werden unser bestanden Datei Einwände gegen die reader.readAsDataURL Methode. Dadurch wird eine Daten-URL für das hochgeladene Bild erstellt. Es funktioniert jedoch nicht so, wie Sie es erwarten. Die Daten-URL wird nicht von der Funktion zurückgegeben. Stattdessen ist die Daten-URL Teil eines Ereignisobjekts.

Vor diesem Hintergrund müssen wir eine Funktion im registrieren reader.onloadend Veranstaltung. Diese Funktion nimmt ein Ereignisobjekt, durch das wir die Daten-URL erhalten: Es ist um e.Target.Ergebnis (Ja, e.target ist der Leser Objekt, aber ich hatte Probleme bei der Verwendung Leser anstelle von e.target innerhalb dieser Funktion). Wir werden nur diese Daten-URL an unsere weiterleiten showUploadedItem Funktion (die wir oben geschrieben haben).

Als nächstes prüfen wir das Formulardaten Objekt. Denken Sie daran, wenn der Browser dies unterstützt Formulardaten, Formulardaten wird ein ... sein Formulardaten Objekt; sonst wird es sein falsch. Also, wenn wir eine haben Formulardaten Objekt, wir werden das anrufen anhängen Methode. Der Zweck von a Formulardaten Das Objekt soll Werte enthalten, die Sie über ein Formular senden. also die anhängen Die Methode nimmt einfach einen Schlüssel und einen Wert. In unserem Fall ist unser Schlüssel Bilder []; indem wir die eckigen Klammern am Ende hinzufügen, stellen wir jedes Mal sicher, dass wir dies tun anhängen einen anderen Wert, wir hängen ihn tatsächlich an dieses Array an, anstatt das zu überschreiben Bild Eigentum.

Wir sind fast fertig. In unserer for-Schleife haben wir jedes der Bilder für den Benutzer angezeigt und dem hinzugefügt Formulardaten Objekt. Jetzt müssen wir nur noch die Bilder hochladen. Außerhalb von zum Schleife, hier ist das letzte Stück unseres Puzzles:

if (formdata) $ .ajax (url: "upload.php", Typ: "POST"), Daten: formdata, processData: false, contentType: false, success: function (res) document.getElementById ("response") ) .innerHTML = res;); 

Wieder müssen wir sicherstellen, dass wir es haben Formulardaten Unterstützung; Wenn wir dies nicht tun, können Sie die Dateien hochladen. Die Schaltfläche wird sichtbar sein, und so wird der Benutzer die Fotos hochladen. Wenn wir aber haben Formulardaten Support, wir kümmern uns um das Hochladen via AJAX. Wir verwenden jQuery, um alle merkwürdigen Eigenschaften von AJAX in Browsern zu behandeln.

Sie sind wahrscheinlich mit jQuery vertraut $ .ajax Methode: Sie übergeben ein Optionsobjekt. Das url, Art, und Erfolg Eigenschaften sollten offensichtlich sein. Das Daten Eigentum ist unser Formulardaten Objekt. Beachten Sie diese Prozessdaten und Inhaltstyp Eigenschaften. Laut jQuery-Dokumentation, Prozessdaten ist wahr standardmäßig und verarbeitet und wandelt die Daten in eine Abfragezeichenfolge um. Das wollen wir nicht, also setzen wir das auf falsch. Wir setzen auch ein Inhaltstyp zu falsch um sicherzustellen, dass die Daten auf den Server gelangen, wie wir es erwarten.

Und das ist es. Wenn der Benutzer die Seite jetzt lädt, wird Folgendes angezeigt:

Und nachdem sie die Bilder ausgewählt haben, sehen sie Folgendes:

Und die Bilder wurden hochgeladen:


Das ist eine Verpackung!

Das Hochladen von Dateien über AJAX ist ziemlich cool, und es ist großartig, dass diese neuen Technologien dies unterstützen, ohne lange Hacks zu benötigen. Wenn Sie Fragen zu dem haben, was wir hier gemacht haben, klicken Sie auf diese Kommentare! Vielen Dank fürs Lesen!

Wenn Sie bei diesem oder einem anderen Codierungsproblem noch Hilfe benötigen, finden Sie Unterstützung in Envato Studio.

Lernen Sie JavaScript: Das komplette Handbuch

Wir haben ein umfassendes Handbuch erstellt, um Sie beim Erlernen von JavaScript zu unterstützen, unabhängig davon, ob Sie gerade erst als Webentwickler anfangen oder sich mit fortgeschrittenen Themen beschäftigen möchten