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
Ron van der Heiden
Verwendung von jQuery
Ich würde eine Schaltfläche und eine unsichtbare Eingabe wie folgt erstellen:
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.
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
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();
});
}
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.
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