Mit purem js ist es einfacher
async function saveFile(inp)
{
let formData = new FormData();
formData.append("file", inp.files[0]);
await fetch('/upload/somedata', {method: "POST", body: formData});
alert('success');
}
<input type="file" onchange="saveFile(this)" >
- Auf der Serverseite können Sie den ursprünglichen Dateinamen (und andere Informationen) lesen, der automatisch in die Anfrage aufgenommen wird.
- Sie müssen den Header "Content-Type" NICHT auf "multipart/form-data" setzen, der Browser setzt ihn automatisch.
- Diese Lösungen sollten auf allen gängigen Browsern funktionieren.
Hier ist ein weiterentwickeltes Snippet mit Fehlerbehandlung, Timeout und zusätzlichem Json-Versand
async function saveFile(inp)
{
let user = { name:'john', age:34 };
let formData = new FormData();
let photo = inp.files[0];
formData.append("photo", photo);
formData.append("user", JSON.stringify(user));
const ctrl = new AbortController() // timeout
setTimeout(() => ctrl.abort(), 50000);
try {
let r = await fetch('/upload/image',
{method: "POST", body: formData, signal: ctrl.signal});
console.log('HTTP response code:',r.status);
alert('success');
} catch(e) {
console.log('Huston we have problem...:', e);
}
}
<input type="file" onchange="saveFile(this)" >
<br><br>
Before selecting the file Open chrome console > network tab to see the request details.
<br><br>
<small>Because in this example we send request to https://stacksnippets.net/upload/image the response code will be 404 ofcourse...</small>
0 Stimmen
Ajax unterstützt keine Datei-Uploads, Sie sollten stattdessen iframe verwenden
1 Stimmen
Verwandte Frage: stackoverflow.com/questions/6974684/
2 Stimmen
Verwandt: stackoverflow.com/questions/166221/