Zeigen Sie vor dem Hochladen eine Bildvorschau an

115

In meinem HTML-Formular habe ich Eingaben mit Typdatei abgelegt, zum Beispiel:

 <input type="file" multiple>

Dann wähle ich mehrere Dateien aus, indem ich auf diese Eingabeschaltfläche klicke. Jetzt möchte ich eine Vorschau ausgewählter Bilder anzeigen, bevor ich das Formular abschicke. Wie geht das in HTML 5?

Hardik Sondagar
quelle
Das Gleiche gilt für Einzelbild: stackoverflow.com/questions/4459379/...
Ciro Santilli郝海东冠状病六四事件法轮功

Antworten:

264

HTML5 wird mit der Datei-API-Spezifikation geliefert , mit der Sie Anwendungen erstellen können, mit denen der Benutzer lokal mit Dateien interagieren kann. Das heißt, Sie können Dateien laden und im Browser rendern, ohne die Dateien tatsächlich hochladen zu müssen. Teil der Datei-API ist die FileReader- Oberfläche, mit der Webanwendungen den Inhalt von Dateien asynchron lesen können.

Hier ist ein kurzes Beispiel, das die FileReaderKlasse verwendet, um ein Bild als DataURL zu lesen und eine Miniaturansicht zu rendern, indem das srcAttribut eines Bild-Tags auf eine Daten-URL gesetzt wird:

Der HTML-Code:

<input type="file" id="files" />
<img id="image" />

Der JavaScript-Code:

document.getElementById("files").onchange = function () {
    var reader = new FileReader();

    reader.onload = function (e) {
        // get loaded data and render thumbnail.
        document.getElementById("image").src = e.target.result;
    };

    // read the image file as a data URL.
    reader.readAsDataURL(this.files[0]);
};

Hier ist ein guter Artikel zur Verwendung der Datei-APIs in JavaScript .

Das Code-Snippet im folgenden HTML-Beispiel filtert Bilder aus der Auswahl des Benutzers heraus und rendert ausgewählte Dateien in mehrere Miniaturansichten:

Kamyar Nazeri
quelle
2
Wie kann ich einige Bilder zum Hochladen abbrechen und dann das Formular senden? Es wird mir wirklich hilfreich sein.
Hardik Sondagar
Aber ich möchte wissen, wie man eine bestimmte Datei löscht, um das Hochladen zu verhindern. Es ist in einer Struktur definiert.
Hardik Sondagar
4
Deaktivieren Sie einfach das Dateieingabeelement und es wird nicht hochgeladen! Also im obigen Beispiel:document.getElementById("uploadImage").disabled = true
Kamyar Nazeri
@KamyarNazeri Wenn FileReader nicht verfügbar ist, wie wäre es dann?
MichaelLuthor
1
@Nicholas Mit dem Code-Snippet unter "Show-Snippet-Abschnitt" können Sie tatsächlich mehrere Bilder laden und eine Vorschau
anzeigen
20

Hier habe ich mit jQuery die FileReader API verwendet.

HTML-Markup:

<input id="fileUpload" type="file" multiple />
<div id="image-holder"></div>

jQuery:

Hier im jQuery-Code überprüfe ich zuerst die Dateierweiterung. dh eine gültige Bilddatei , die verarbeitet werden soll, prüft dann, ob der Browser die FileReader- API unterstützt. Ja, dann wird nur verarbeitet, andernfalls wird die entsprechende Meldung angezeigt

$("#fileUpload").on('change', function () {

     //Get count of selected files
     var countFiles = $(this)[0].files.length;

     var imgPath = $(this)[0].value;
     var extn = imgPath.substring(imgPath.lastIndexOf('.') + 1).toLowerCase();
     var image_holder = $("#image-holder");
     image_holder.empty();

     if (extn == "gif" || extn == "png" || extn == "jpg" || extn == "jpeg") {
         if (typeof (FileReader) != "undefined") {

             //loop for each file selected for uploaded.
             for (var i = 0; i < countFiles; i++) {

                 var reader = new FileReader();
                 reader.onload = function (e) {
                     $("<img />", {
                         "src": e.target.result,
                             "class": "thumb-image"
                     }).appendTo(image_holder);
                 }

                 image_holder.show();
                 reader.readAsDataURL($(this)[0].files[i]);
             }

         } else {
             alert("This browser does not support FileReader.");
         }
     } else {
         alert("Pls select only images");
     }
 });

Ausführlicher Artikel: Vorschau des Bildes vor dem Hochladen, jQuery, HTML5 FileReader () mit Live-Demo

Satinder singh
quelle
1
ist nicht als schlecht Praxis , wenn Sie declear varin for loop? Jedes Mal, wenn eine for loopneue Variable iteriert readerwird, wird deklariert.
Phoenix
Das Hinzufügen eines accept="image/*"Attributs zum <Eingang> kann dazu beitragen, die Auswahl von Nicht-Bilddateitypen zu verhindern.
August
Wie kann ich die Namen der Bilder zusammen mit der Bildvorschau anzeigen?
Naveenbos
4

Yogesh Chatrola
quelle
1

Stellen Sie für Hintergrundbilder sicher, dass Sie verwenden url()

node.backgroundImage = 'url(' + e.target.result + ')';
Epicgear
quelle