Wie öffne ich den Dateiauswahldialog über js?

Lesezeit: 8 Minuten

Wie offne ich den Dateiauswahldialog uber js
Luciuz

$('#id').click();

Es funktioniert nicht mit Chrome 26 unter Mac OS.

Das eigentliche Problem ist die Erstellung von „Upload“-Widgets, die in ein Formular integriert werden können. Widget besteht aus zwei Teilen. Der erste Teil ist div mit Initiator-Button und Fehler-/Erfolgsmeldungen. Ich denke, der Weg ist ein anderes Formular als der zweite Teil mit Dateieingabe und Datei in den Iframe zu senden. Nach dem Absenden füllen wir das verborgene Feld im ersten Teil des Hauptformulars aus oder zeigen Fehler darin an.

Ein einfacher Weg ist das Hinzufügen eines Dateiformulars zum Hauptformular, aber es ist verboten.

  • Glücklicherweise können Sie das native Dialogverhalten beim Öffnen von Dateien nicht simulieren

    – A. Wolff

    25. April 2013 um 13:18 Uhr

  • Möchten Sie nur das Upload-Eingabeelement formatieren? damit es nicht das Standard-Look hat, sondern zB das Aussehen eines Buttons?

    – t.niese

    25. April 2013 um 13:19 Uhr

  • Weiß niemand, wie man den Dialog öffnet, ohne type=”file” zu verwenden? Einfach nur Javascript.

    – L1ghtk3ira

    31. August 2018 um 17:24 Uhr

1647105128 448 Wie offne ich den Dateiauswahldialog uber js
Ron van der Heiden

Verwendung von jQuery

Ich würde eine Schaltfläche und eine unsichtbare Eingabe wie folgt erstellen:

<button id="button">Open</button>
<input id="file-input" type="file" name="name" style="display: none;" />

und fügen Sie etwas jQuery hinzu, um es auszulösen:

$('#button').on('click', function() {
    $('#file-input').trigger('click');
});

Mit Vanilla JS

Gleiche Idee, ohne jQuery (Dank an @Pascale):

<button onclick="document.getElementById('file-input').click();">Open</button>
<input id="file-input" type="file" name="name" style="display: none;" />

  • Es ist eine viel, viel elegantere Lösung, als das Eingabefeld transparent zu machen

    – Aron Lorincz

    2. Juli 2015 um 6:23 Uhr

  • Ich habe dieselbe Technik verwendet (in reinem js: form.file_selector.click();), wobei file_selector eine dynamisch hinzugefügte Dateieingabe ist (hinzugefügt durch innerHTML). aber es funktioniert nicht. Irgendwelche Hilfe oder Vorschläge bitte?

    – fekiri malek

    2. August 2016 um 13:26 Uhr


  • @Ron van der Heijden danke, ich glaube, ich habe herausgefunden, warum es nicht funktioniert hat (jetzt funktioniert es sowieso). Für diejenigen, die möglicherweise ein ähnliches Problem haben, kann dies die Ursache sein, wenn das Ereignis aus Sicherheitsgründen nicht ausgelöst wird, es sei denn, es wird nach einem Benutzerereignis (Klick oder so) aufgerufen. Ich wollte das Ereignis direkt nach (innerhalb einer Funktion) einer Ajax-Anfrage auslösen.

    – fekiri malek

    5. August 2016 um 23:01 Uhr

  • Vielen Dank für das Vanilla JS-Beispiel!

    – Jobsamuel

    6. Juni 2017 um 16:36 Uhr

  • Wie kann ich den ausgewählten Ordnerpfad abrufen?

    – eomer

    29. Juli 2019 um 9:15 Uhr

Nur JS – keine Notwendigkeit für jquery

Einfach ein Eingabeelement erstellen und den Klick auslösen.

var input = document.createElement('input');
input.type="file";
input.click();

Dies ist das einfachste, öffnen Sie einen Dateiauswahldialog, aber es nützt nichts, ohne die ausgewählte Datei zu handhaben …

Umgang mit den Dateien

Hinzufügen eines onchange -Ereignis für die neu erstellte Eingabe würde es uns ermöglichen, Dinge zu tun, sobald der Benutzer die Datei ausgewählt hat.

var input = document.createElement('input');
input.type="file";

input.onchange = e => { 
   var file = e.target.files[0]; 
}

input.click();

Im Moment haben wir die Dateivariable, die verschiedene Informationen speichert:

file.name // the file's name including extension
file.size // the size in bytes
file.type // file type ex. 'application/pdf'

Toll!

Aber was, wenn wir den Inhalt der Datei brauchen?

Um an den eigentlichen Inhalt der Datei zu gelangen, aus verschiedenen Gründen. Platzieren Sie ein Bild, laden Sie es in die Leinwand, erstellen Sie ein Fenster mit einer Base64-Daten-URL usw., die wir verwenden müssten FileReader API

Wir würden eine Instanz des FileReader erstellen und unsere vom Benutzer ausgewählte Dateireferenz darauf laden.

var input = document.createElement('input');
input.type="file";

input.onchange = e => { 

   // getting a hold of the file reference
   var file = e.target.files[0]; 

   // setting up the reader
   var reader = new FileReader();
   reader.readAsText(file,'UTF-8');

   // here we tell the reader what to do when it's done reading...
   reader.onload = readerEvent => {
      var content = readerEvent.target.result; // this is the content!
      console.log( content );
   }

}

input.click();

Wenn Sie versuchen, den obigen Code in das Konsolenfenster Ihres Devtools einzufügen, sollte ein Dialogfeld zum Auswählen einer Datei angezeigt werden. Nach dem Auswählen der Datei sollte die Konsole nun den Inhalt der Datei drucken.

Beispiel – „Das neue Hintergrundbild von Stackoverflow!“

Lassen Sie uns versuchen, einen Dateiauswahldialog zu erstellen, um das Hintergrundbild von stackoverflows in etwas scharferes zu ändern …

var input = document.createElement('input');
input.type="file";

input.onchange = e => { 

   // getting a hold of the file reference
   var file = e.target.files[0]; 

   // setting up the reader
   var reader = new FileReader();
   reader.readAsDataURL(file); // this is reading as data url

   // here we tell the reader what to do when it's done reading...
   reader.onload = readerEvent => {
      var content = readerEvent.target.result; // this is the content!
      document.querySelector('#content').style.backgroundImage="url("+ content +')';
   }

}

input.click();

Öffnen Sie devtools und fügen Sie den obigen Code in das Konsolenfenster ein. Dadurch sollte ein Dialogfeld zum Auswählen einer Datei angezeigt werden. Bei der Auswahl eines Bildes sollte sich der Hintergrund des Inhaltsfelds von stackoverflows in das ausgewählte Bild ändern.

Prost!

  • Dieses Code-Snippet kann zwar die Frage lösen, inklusive Erklärung hilft wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für zukünftige Leser beantworten und diese Personen die Gründe für Ihren Codevorschlag möglicherweise nicht kennen. Bitte versuchen Sie auch, Ihren Code nicht mit erklärenden Kommentaren zu überladen, dies verringert die Lesbarkeit sowohl des Codes als auch der Erklärungen!

    – kayess

    5. Dezember 2016 um 10:47 Uhr

  • Exzellent. Aber ich hatte Probleme, dies auf Safari iOS zum Laufen zu bringen. Das onchange-Ereignis wurde nicht ausgelöst.

    – Bitrevolution

    23. August 2017 um 10:46 Uhr

  • Hier erfahren Sie, wie Sie auf die Datei zugreifen: developer.mozilla.org/en-US/docs/… document.getElementById('input').files[0];

    – cmann

    15. September 2017 um 7:05 Uhr


  • Als ich den vorgeschlagenen Code verwendete, erhielt ich die folgende Fehlermeldung: File chooser dialog can only be shown with a user activation. Wie kann ich dieses Problem lösen?

    – Paulus

    3. April 2020 um 11:13 Uhr

  • @ Paul File chooser dialog can only be shown with a user activation. Grundsätzlich bedeutet das, dass es nur geöffnet wird, wenn ein Benutzer auf etwas geklickt hat. Versuchen Sie so etwas: document.body.onclick = openFileFunction. Wenn Sie auf die Webseite klicken, sollte sie sich jetzt ordnungsgemäß öffnen.

    – luk baja

    5. Dezember 2020 um 19:16 Uhr

1647105129 226 Wie offne ich den Dateiauswahldialog uber js
Jairopro

Ready-to-Use-Funktion (mit Promise)

/**
 * Select file(s).
 * @param {String} contentType The content type of files you wish to select. For instance, use "image/*" to select all types of images.
 * @param {Boolean} multiple Indicates if the user can select multiple files.
 * @returns {Promise<File|File[]>} A promise of a file or array of files in case the multiple parameter is true.
 */
function selectFile(contentType, multiple){
    return new Promise(resolve => {
        let input = document.createElement('input');
        input.type="file";
        input.multiple = multiple;
        input.accept = contentType;

        input.onchange = () => {
            let files = Array.from(input.files);
            if (multiple)
                resolve(files);
            else
                resolve(files[0]);
        };

        input.click();
    });
}

Probieren Sie es hier aus

// Content wrapper element
let contentElement = document.getElementById("content");

// Button callback
async function onButtonClicked(){
    let files = await selectFile("image/*", true);
    contentElement.innerHTML = files.map(file => `<img src="https://stackoverflow.com/questions/16215771/${URL.createObjectURL(file)}" style="width: 100px; height: 100px;">`).join('');
}

// ---- function definition ----
function selectFile (contentType, multiple){
    return new Promise(resolve => {
        let input = document.createElement('input');
        input.type="file";
        input.multiple = multiple;
        input.accept = contentType;

        input.onchange = _ => {
            let files = Array.from(input.files);
            if (multiple)
                resolve(files);
            else
                resolve(files[0]);
        };

        input.click();
    });
}
<button onclick="onButtonClicked()">Select images</button>
<div id="content"></div>

  • Wenn Sie den Dialog einfach schließen, ohne eine Datei auszuwählen, wird die Auflösung nie aufgerufen und der Codefluss hängt.

    – Sonntag

    2. Februar 2019 um 0:06 Uhr

  • Javascript hat keine first Methode für Array.

    – Chris_F

    27. April 2019 um 2:01 Uhr

  • Diese Antwort könnte verbessert werden, indem eine Erklärung hinzugefügt wird, wie Ihre Antwort funktioniert.

    – Gelees

    29. Mai 2019 um 6:47 Uhr

Wie offne ich den Dateiauswahldialog uber js
Paska

Der Vollständigkeit halber die Lösung von Ron van der Heijden in reinem JavaScript:

<button onclick="document.querySelector('.inputFile').click();">Select File ...</button>
<input class="inputFile" type="file" style="display: none;">

Wie offne ich den Dateiauswahldialog uber js
Nunocastromartine

Nur in HTML:

<label>
  <input type="file" name="input-name" style="display: none;" />
  <span>Select file</span>
</label>

Bearbeiten: Ich hatte das nicht in Blink getestet, es funktioniert eigentlich nicht mit a <button>aber es sollte mit den meisten anderen Elementen funktionieren – zumindest in neueren Browsern.

Überprüfen diese Geige mit obigem Code.

Um die Antwort von „levi“ zu erweitern und zu zeigen, wie Sie die Antwort vom Upload erhalten, damit Sie den Datei-Upload verarbeiten können:

selectFile(event) {
    event.preventDefault();

    file_input = document.createElement('input');
    file_input.addEventListener("change", uploadFile, false);
    file_input.type="file";
    file_input.click();
},

uploadFile() {
    let dataArray = new FormData();
    dataArray.append('file', file_input.files[0]);

    // Obviously, you can substitute with JQuery or whatever
    axios.post('/your_super_special_url', dataArray).then(function() {
        //
    });
}

function promptFile(contentType, multiple) {
  var input = document.createElement("input");
  input.type = "file";
  input.multiple = multiple;
  input.accept = contentType;
  return new Promise(function(resolve) {
    document.activeElement.onfocus = function() {
      document.activeElement.onfocus = null;
      setTimeout(resolve, 500);
    };
    input.onchange = function() {
      var files = Array.from(input.files);
      if (multiple)
        return resolve(files);
      resolve(files[0]);
    };
    input.click();
  });
}
function promptFilename() {
  promptFile().then(function(file) {
    document.querySelector("span").innerText = file && file.name || "no file selected";
  });
}
<button onclick="promptFilename()">Open</button>
<span></span>

994500cookie-checkWie öffne ich den Dateiauswahldialog über js?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy