Wie laden Sie Bilder jetzt hoch?
Sie wählen eine Datei aus und klicken auf Hochladen. Ganz einfach, oder? Nur, sobald Sie Ihr Bild ausgewählt haben, können Sie nicht mehr sehen, was ausgewählt wurde. Der Dateiname steht am Ende des Eingabefelds, und wenn das Feld kurz ist oder der Dateipfad lang, sehen Sie nichts Nützliches. Sie vergessen, was Sie ausgewählt haben und haben keine Ahnung, was Sie hochladen werden. „Moment, habe ich ein Bild von meinem Gesicht hochgeladen oder etwas weniger Professionelles?“
Machen wir es besser.
Der Schlüssel ist eine Bildvorschau, die angezeigt wird, bevor der Benutzer sie speichern muss. Wir verzichten also auf den Upload-Button zugunsten eines Speicher-Buttons. Wenn nun eine Datei über die Dateiauswahl ausgewählt wird, wird etwas AJAX ausgelöst. Das Bild wird serverseitig verarbeitet und ein Miniaturbild wird auf die bestehende Seite geladen.
Fühlt sich das nicht viel besser an? Wir haben jetzt eine visuelle Darstellung (stellen Sie sich das vor) des ausgewählten Bildes.
Dies ist besonders nützlich in größeren Formularen, bei denen viele Felder mit einer einzigen Aktion übermittelt werden. Es ermöglicht dem Benutzer, das Formular zu überprüfen, bevor er auf Speichern klickt, und zu sehen, welches Bild (oder welche Bilder) er ausgewählt hat.
So funktioniert's
Neugierig, wie das gemacht wird? Hier ist der Code.
Wir können ein Standard-HTML-Formular verwenden. Dies sowie ein Bereich für die Bildvorschau werden wir einbinden.
<div id="upload-area">
<div id="preview">
<img width="100px" height="100px" src="/images/icons/128px/zurb.png" id="thumb">
</div>
<form action="/playground/ajax_upload" id="newHotnessForm">
<label>Upload a Picture of Yourself</label>
<input type="file" size="20" id="imageUpload" class=" ">
<button class="button" type="submit">Save</button>
</form>
</div>
Die Aktion des Formulars sollte auf einen Ort zeigen, der das Hochladen des Bildes verarbeitet, unabhängig davon, ob JavaScript vorhanden ist oder nicht. Sie sollten auch in Erwägung ziehen, die Markup für die Vorschau nur per JavaScript hinzuzufügen, da dies ohne JS nicht funktionieren würde.
Sie benötigen jQuery und das AJAX Upload jQuery Plugin von Andrew Valums. Binden Sie diese ein und stellen Sie sicher, dass jQuery zuerst geladen wird. Beachten Sie, dass das AJAX Upload Plugin einige Konfigurationen und serverseitige Komponenten benötigt, um zu funktionieren. Weitere Details finden Sie unter diesem Link.
<script src="/js/jquery.min.js" type="text/javascript"></script>
<script src="/js/ajaxupload.js" type="text/javascript"></script>
Hier ist der JavaScript-Code, den wir vollständig hinzufügen werden.
$(document).ready(function(){
var thumb = $('#thumb');
new AjaxUpload('imageUpload', {
action: $('#newHotnessForm').attr('action'),
name: 'image',
onSubmit: function(file, extension) {
$('#preview').addClass('loading');
},
onComplete: function(file, response) {
thumb.load(function(){
$('#preview').removeClass('loading');
thumb.unbind();
});
thumb.attr('src', response);
}
});
});
Hier ist das Ganze in einfacher Sprache
- Plugin-Verhalten auf das Dateieingabefeld anwenden
- Die Aktions-URL angeben, die entsprechend aus der Aktions-URL im Markup gezogen wird
- Wenn eine Datei ausgewählt wird, sofort eine Klasse namens „loading“ zum Vorschau-Bereich hinzufügen. Diese Klasse verbirgt das Bild durch CSS (z.B..loading img { display: none; }und wendet ein Hintergrundbild an (ein Spinner)
- Nach erfolgreichem AJAX dieloadingKlasse entfernen und diesrcdes Bildes auf die Antwort-URL setzen, die das Plugin zurückgibt.
Nur Vorschau
Beachten Sie, dass der obige Code nur die Vorschaufunktion behandelt. Das Dateieingabefeld enthält immer noch den korrekten Dateipfad. Wenn der Benutzer also auf die Schaltfläche „Speichern“ klickt, muss das Formular immer noch von der serverseitigen Technologie verarbeitet und behandelt werden, die Sie dafür bereitstellen. Ja, Sie laden das Bild im Wesentlichen einmal hoch (für die Vorschau) und dann noch einmal (um es dauerhafter zu speichern).
Bei der Einrichtung/Konfiguration des Plugins legen Sie ein Verzeichnis für ein serverseitiges Skript fest, das hochgeladene Bilder speichert. Möglicherweise möchten Sie, dass dieses Verzeichnis unter etwas wie/images/temp/liegt. So wissen Sie, dass alles, was in dieses Verzeichnis hochgeladen wird, temporär ist und vorübergehend bereinigt werden kann, um den Server sauber zu halten. Ein CRON-Job zum Leeren dieses Verzeichnisses wäre eine gute Idee.
Demo
Eine funktionierende Demo ist auf der ZURB-Website verfügbar, die auch weitere schriftliche Informationen enthält. Aufgrund der serverseitigen Verarbeitung ist ein Download leider nicht praktikabel.
Interessieren Sie sich für andere coole Techniken mit CSS3 und JavaScript? Schauen Sie sich das ZURB Playground an.
ZURB ist ein eng verbundenes Team von Interaktionsdesignern und Strategen, das Unternehmen dabei hilft, bessere Produkte und Dienstleistungen zu entwickeln. Seit 1998 hat ZURB über 75 Kunden unterstützt, darunter: Facebook, eBay, NYSE, Yahoo, Zazzle, Playlist, Britney Spears und andere.
Danke für die Tipps!
Könnten Sie mir eine Art einfaches AJAX-Skript für den Fortschrittsbalken beim Datei-Upload empfehlen? Es scheint schwer zu finden zu sein.
Danke!
Ein AJAX-Upload-Balken ist schwer zu finden, da er von der serverseitigen Sprache abhängt, die Sie verwenden. Wenn PHP, werfen Sie einen Blick auf pecl APC.
Ansonsten gibt es einige Flash-SWF-Uploader, aber ich mag Flash nicht, also würde ich sie nicht empfehlen ;)
Sie können nach HTML5 Upload Progress googeln, das werden Sie finden
Ich weiß, das mag etwas faul klingen, aber könnte man nicht einfach eine altmodische animierte GIF-Datei erstellen und AJAX verwenden, um die Klasse „loading“ hinzuzufügen, wie in Chris' Code, die ein CSS-Attribut haben könnte, das die Lade-Animations-GIF-Datei aufruft, bis die Klasse entfernt wird. Dieser Weg gibt keine präzisen Ladeinformationen, impliziert aber, dass etwas passiert.
Ja, aber ich würde empfehlen, eine kleine Flash-Animation ähnlich einem GIF zu erstellen. Im Test hat IE die GIF-Animation eingefroren.
Ich empfehle die Verwendung eines beliebigen Flash-basierten Uploaders, da dies Ihr Leben erheblich erleichtert. Ich empfehle diese beiden
jqUploader
SWFUpload jQuery Plugin
Das Schöne an diesen Uploadern ist, dass sie beide über eine nette jQuery-API verfügen :)
Danke für das Remake dieses dynamischen Skripts, das unser Leben als Entwickler erheblich erleichtert – ganz zu schweigen davon, dass es unsere weniger versierten Kunden wirklich beeindruckt.
Die Anspielung auf „Men In Black“ gefällt mir.
Tolles Skript!
Sehr praktisch – aber es gibt ein kleines Problem mit diesem Ansatz.
Was passiert, wenn der Benutzer versehentlich die falsche Datei/das falsche Bild auswählt? Normalerweise könnte man das ändern, aber jetzt wird es automatisch hochgeladen.
Das wird problematisch, wenn der Benutzer nicht wartet, bis das Bild vollständig hochgeladen ist. Probieren Sie es auf der Demo aus: Wählen Sie ein Bild und danach ein weiteres Bild und so weiter. Alle Bilder werden nacheinander in eine Warteschlange gestellt und geladen/angezeigt (wenn sie verarbeitet sind).
Wenn der Benutzer bereits „speichert“, bevor das „endgültige Bild“ verarbeitet ist, welches wird dann als Avatar verwendet?
Abgesehen davon ein tolles Beispiel für Benutzerfreundlichkeit :)
Das ist eines der ersten Dinge, die mir aufgefallen sind. Ich habe ein riesiges Bild ausgewählt… 3 MB… und während es sehr langsam hochgeladen wurde, habe ich gemerkt, dass ich bereits eine kleinere Version davon hatte. Die einzige Lösung, die ich fand, war, die Seite neu zu laden und von vorne zu beginnen.
Definitiv braucht es irgendwo einen „Abbrechen“-Button.
Um Marcos Ausführungen weiter zu ergänzen: Die Lösung ist ein Teil eines größeren Puzzles. Obwohl dies eine großartige Frontend-Lösung ist, befasst sie sich nicht damit, wie dies serverseitig zu handhaben ist.
Sie können Annahmen darüber treffen, was der „Speichern“-Button tut und welche DB-Abfragen er auslösen könnte, aber Sie müssen auch Bilder berücksichtigen, die auf Ihrem Server verbleiben, wenn mehrere Dateien hochgeladen werden, oder wie Sie sie löschen, wenn Sie nur eine speichern möchten.
Vielleicht Runde 2 dieses Artikels :)
Das AJAX Upload Plugin speichert Dateien in einem Verzeichnis, wie ich im Artikel erwähnt habe, am besten speichert man es in einem TEMP-Verzeichnis. Das Klicken auf die Schaltfläche „Speichern“ speichert es vermutlich an einem dauerhafteren Ort. Was das Formular tatsächlich hochlädt, ist der aktuelle Dateipfad im Eingabefeld.
Ich glaube nicht, dass es so verwirrend ist, wie es hier dargestellt wird.
Ich stimme zu, es ist nicht schwer, das Löschproblem zu umgehen.
Sobald der Benutzer gespeichert hat, können Sie den Dateinamen und die Vorschau/das Miniaturbild behalten, wie Sie möchten, und dann ein Löschradio (oder was auch immer) für dieses Foto hinzufügen.
Dies war die Quelle vieler Überlegungen für mich auf meiner Seite – ich habe es noch nicht gemeistert, aber diese Demo hilft.
Tim
Ich habe das auf einer Website verwendet, aber in Chrome wurde „Datei nicht ausgewählt“ angezeigt, obwohl ich eine ausgewählt hatte. Wurde das behoben?
Hallo Fiaz – Danke für die Anfrage. Das Plugin funktioniert, diese Anzeige ist nur in Chrome etwas verwirrend. Es ist ein Chrome-spezifisches Problem. Wir werden sehen, was wir tun können, um dies zu verbessern.
Danke für Ihre Teilnahme! Wie gefallen Ihnen unsere anderen ZURBplayground-Techniken?
-Dmitry
Ich habe nach AJAX-Bild-Uploadern gesucht und mir sogar die ZURB-Website angesehen, aber ich suchte speziell nach einem Upload mit einer Funktion zum Ändern der Größe und Zuschneiden — (es scheint keinen Code dafür im Web zu geben)
Für den Durchschnittswebnutzer (vielleicht bin das ich?) ist nicht klar, dass das Bild nicht gespeichert wird, wenn es in der Vorschau angezeigt wird, man sieht das Bild auf der Seite und geht davon aus, dass es hochgeladen ist?
Leider funktioniert es nicht mit Opera 10.53.
Wenn ich mich nicht irre, war es früher auch schon bei Zurb vorhanden, ich glaube, ich habe es gesehen.
Warum machen Sie nicht Folgendes: Wenn der Benutzer das Bild auswählt, wird der Bildpfad in das Vorschau-`img`-Tag eingefügt, wie
<img src="file://c:/SomeImage.png" />und wenn es dem Benutzer gefällt, kann er es hochladen.
Diese Idee gefällt mir sehr gut. Ich glaube, ich habe das noch nie so gesehen. Ich frage mich, ob es eine Barriere gibt, die das verhindert (wie browserübergreifende Unterschiede bei der Bereitstellung des Dateipfads), oder ob die Leute einfach nicht schlau genug waren, es zu versuchen...
Ich liebe diese Idee!!!
Ich werde das heute nach der Arbeit in verschiedenen Browsern testen.
Es ist eine genial einfache Idee! Ich bin gespannt, ob es funktioniert.
Ich kann nicht verstehen, warum das nicht funktionieren sollte, das habe ich auch gedacht, als ich den Artikel gelesen habe. Es wäre auch sehr reaktionsschnell, viel schneller.
Das einzige Problem, das ich vorhersehen kann, ist bei sicheren Seiten und der Warnung von Internet Explorer vor der Mischung von sicheren und unsicheren Elementen.
Habe gerade das hier gefunden: http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_26302820.html, anscheinend sieht es so aus, als wäre es nicht möglich.
Ich habe einige Nachforschungen dazu angestellt und es sieht nicht gut aus. Es gibt eine Umgehungslösung mit Firefox, die Ihnen Zugriff auf eine Funktion gibt, um die Bilddaten als Data-URI zu erhalten. IE und Opera geben einen seltsamen /fakepath/-Wert zurück, und Safari/Chrome geben überhaupt keinen Wert für ein Dateieingabefeld zurück.
Nun, ich bin froh, dass das jemand gesagt hat, denn dieses ganze Konzept scheint mir nutzlos. Warum all diese Ressourcen client- und serverseitig verschwenden, wenn man den Browser einfach auf die lokale Datei verweisen kann? *kratzt sich am Kopf*
Ja, ich habe gerade die Seite nach unten gescrollt, um das zu suchen, bevor ich das Gleiche kommentiere.
Getestet in einer HTTP-Umgebung unter Firefox 2 auf einem Mac. (nicht auf einem PC und nicht mit HTTPS, ich weiß nicht, ob das ein Problem wäre).
Hehe, dieser Kommentar macht den ganzen Artikel bedeutungslos.
Eine Mootools-Alternative, die auch FF Drag and Drop unterstützt: http://mootools.standupweb.net/dragndrop.php
Kleines Problem/eher eine Frage… keine Unterstützung für iPad oder iPhone zur Auswahl eines Fotos zum Hochladen mit dieser Methode… Mein erster Gedanke ist, ein Eingabefeld zu der „Neuen Sensation“ hinzuzufügen, das das Kopieren und Einfügen des Dateinamens ermöglicht, aber das löst das Problem nicht wirklich benutzerfreundlich (sie müssten das Foto an sich selbst mailen und dann die Weiterleitungsmails durchgehen, um Zugriff auf den Dateinamen zu erhalten… hat jemand eine elegant Lösung dafür?
Ist es nicht besser, eine Technik zu verwenden, bei der die Datei über die versteckte iFrame-Methode hochgeladen wird?
Sie können das Bild immer noch in der Vorschau anzeigen, aber mit etwas serverseitiger Skripterstellung können Sie diese Datei bei der Formularübermittlung beibehalten, ohne darauf warten zu müssen, dass die Datei ein zweites Mal hochgeladen wird (die serverseitige Skripterstellung muss auch einen Fallback bieten, wenn das Formular eine Datei normal hochlädt).
Der Vorschau-Upload (der die URL zum Bild zurückgibt) könnte bei der Übermittlung verwendet werden. Lassen Sie ihn auch einen Hash-Code senden.
Wenn der Benutzer seit dem letzten erfolgreichen Vorschau-Aufruf nicht erneut durchsucht hat, senden Sie den Hash-Code der Vorschau, damit der Server ihn nicht erneut herunterladen muss, sondern die frühere Datei einfach aus dem temporären Verzeichnis an einen dauerhaften Speicherort verschiebt.
Wenn ich es von Grund auf neu aufbauen würde, würde ich das auch versuchen. Wenn die Datei bereits einmal per AJAX hochgeladen wurde, sollte das Klicken auf Speichern einfach eine Aktion auslösen, um diese Datei an den dauerhaften Speicherort zu verschieben und fertig zu sein.
Bezüglich des „Bereinigungsproblems“: Verwenden Sie eine Datenbank mit temporären Dateinamen und Upload-Zeitstempeln. Nach Abschluss des Uploads schreiben Sie die temporäre Datei und den Zeitstempel in die Datenbank. Bei der Übermittlung entfernen Sie sie aus der Datenbank. Lassen Sie ein Cron-Skript täglich/wöchentlich laufen, das die Uploads vom Vortag/der Vorwoche abfragt und diese Dateien löscht. Dies sind alle Bilder, die hochgeladen und nie übermittelt wurden. Sehr, sehr einfaches Skript/Datenbank und recht effektiv.
Das sind gute Informationen! Besonders gefällt mir die MIB-Referenz.
K
Sobald das Formular übermittelt wurde, kann die temporäre Vorschau-Datei per PHP oder einer anderen serverseitigen Sprache gelöscht werden.
huh;) Dieser Artikel hat mir das Leben gerettet, tolle Sache, besonders weil es mit Ajax gemacht ist. Macht weiter so und b.r.!
Hier ist, wie ich es implementiert habe. Ich habe vier Bild-Upload-Boxen auf meiner Website, und wenn jede davon angeklickt wird, wird ein Bild automatisch hochgeladen.
Mein Formular hat überhaupt keine Feldeingaben. Ich habe den Ajax-Upload auf ein Upload-Icon angewendet, und nachdem das Bild hochgeladen ist, habe ich ein PHP-Skript, das eine gezoomte, zugeschnittene Vollversion und ein 100x100-Miniaturbild in einem temporären Ordner erstellt. Der Pfad zum Miniaturbild wird in der Antwortvariable zurückgegeben, und ich verwende diesen, um ein Miniaturbild im Formular zu aktualisieren und die Antwort in ein verstecktes Feld einzufügen. Dann blende ich das Upload-Icon aus und ersetze es durch ein Lösch-Icon. Wenn das Lösch-Icon angeklickt wird, setze ich das Miniaturbild zurück, lösche das versteckte Feld und blende dann das Lösch-Icon aus und zeige das Upload-Icon an.
Wenn das Formular übermittelt wird, liest das empfangende Skript die versteckten Eingaben und verschiebt diese Bilder und Miniaturbilder aus dem temporären Ordner in ihren permanenten Ordner.
Ich habe einen Cron-Job, der die Änderungszeit jeder Datei im temporären Ordner überprüft und sie mit der aktuellen Zeit vergleicht. Wenn die Differenz größer als 14400 ist, lösche ich die Datei (4 Stunden alt). Ich wische den Ordner nicht einfach aus, weil ich möglicherweise ein Bild eines Benutzers lösche, der das Formular noch verwendet. Wenn es länger als vier Stunden dauert, bis jemand ein Formular mit weniger als 10 Feldern übermittelt, hat er größere Probleme als das Verschwinden seiner Uploads.
Und für diejenigen, die sagen, ich sollte Feldeingaben haben, falls jemand Javascript deaktiviert hat – meine Website ist ein Google Maps Mashup, also wenn sie kein Javascript aktiviert haben, können sie meine Website sowieso nicht nutzen.
Meine einzige Frage ist, warum nach Abschluss des iFrame-Uploads meine Statusleiste immer noch eine Fortschrittsanzeige anzeigt, obwohl alle Anfragen abgeschlossen sind?
Danke
B
Kann ich diese Benutzeroberfläche in ASP.NET verwenden?
Ich verwende jUploadify in diesem Projekt hier (Sie können es nur sehen, wenn Sie registriert sind, auf Ihrer Profilseite (Deutsch)) -> http://1click.at/23s6h1
Funktioniert das in Google Chrome?
Ich glaube nicht, dass die Demo noch funktioniert, ich habe das eigentliche Skript noch nicht getestet. Aber alles, was ich sehe, ist ein schönes Foto von Chuck Norris, getestet in Chrome, Safari, Opera, IE7+8 unter XP und 7 :)
Hier ist ein weiteres lustiges Ajax-Ding...
HTML5 Ajax-Website http://bit.ly/9hXmZt
Danke für die Hilfe
Hallo, nur um zu prüfen, ob das in IE funktioniert, und kann ich auch die Mindestversion für jQuery überprüfen? Habe gesehen, dass sie in der Demo 1.7.1 verwenden; funktioniert es, wenn ich jQuery 1.4.4 verwende?
Die Seite mit dem AjaxUpload-Plugin ist nicht funktionsfähig. Gibt es andere Quellen für dieses Plugin?