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?



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:


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


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


1

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

node.backgroundImage = 'url(' + e.target.result + ')';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.