JavaScript: Unggah file

190

Katakanlah saya memiliki elemen ini di halaman:

<input id="image-file" type="file" />

Ini akan membuat tombol yang memungkinkan pengguna halaman web untuk memilih file melalui dialog "File open ..." di browser.

Katakanlah pengguna mengklik tombol berkata, memilih file dalam dialog, lalu mengklik tombol "Oke" untuk menutup dialog.

Nama file yang dipilih sekarang disimpan di:

document.getElementById("image-file").value

Sekarang, katakanlah server menangani POST multi-bagian di URL "/ unggah / gambar".

Bagaimana cara mengirim file ke "/ unggah / gambar"?

Juga, bagaimana saya mendengarkan pemberitahuan bahwa file sudah selesai diunggah?

YummyBánhMì
sumber
2
JavaScript tidak menangani unggahan, karena itu berada di sisi server. Skrip sisi server akan menerima file, dan kemudian memindahkannya. Untuk php dari folder sementara ke folder yang diinginkan.
Bakudan
15
Memilih untuk membuka kembali karena pertanyaannya adalah tentang POJS (javascript lama biasa) bukan jQuery.
e2-e4

Jawaban:

95

Kecuali Anda mencoba mengunggah file menggunakan ajax, cukup kirimkan formulir ke /upload/image.

<form enctype="multipart/form-data" action="/upload/image" method="post">
    <input id="image-file" type="file" />
</form>

Jika Anda ingin mengunggah gambar di latar belakang (mis. Tanpa mengirimkan seluruh formulir), Anda dapat menggunakan ajax:

Matt Ball
sumber
atau iframe ukuran 0x0 dengan skrip pengunggah gambar di dalam src = "" dan memposting formulir ke sana menggunakan target = "iframeId" membaca hasilnya kembali pada acara iframe src .load yang dapat diikat menggunakan jQuery misalnya.
Dmitry
11
Sebenarnya dimungkinkan untuk melakukan upvote melalui Javascript dan Ajax saat ini, lihat: stackoverflow.com/a/10811427/694469 (Saya tidak melakukan downvote).
KajMagnus
35
@KajMagnus, Anda mungkin bermaksud 'mengunggah' tetapi secara tidak sengaja mengatakan 'upvote'
Samuel Allan
85

JS murni

Anda dapat menggunakan pengambilan secara opsional dengan await-try-catch

let photo = document.getElementById("image-file").files[0];
let formData = new FormData();

formData.append("photo", photo);
fetch('/upload/image', {method: "POST", body: formData});

Pendekatan sekolah lama - xhr

let photo = document.getElementById("image-file").files[0];  // file from input
let req = new XMLHttpRequest();
let formData = new FormData();

formData.append("photo", photo);                                
req.open("POST", '/upload/image');
req.send(formData);

RINGKASAN

  • Di sisi server Anda dapat membaca nama file asli (dan info lainnya) yang secara otomatis disertakan untuk diminta oleh browser dalam filenameparameter formData.
  • Anda TIDAK perlu set header permintaan Content-Typeuntuk multipart/form-data- ini akan diatur secara otomatis oleh browser.
  • Alih-alih /upload/imageAnda dapat menggunakan alamat lengkap seperti http://.../upload/image.
  • Jika Anda ingin mengirim banyak file dalam multipleatribut penggunaan permintaan tunggal <input multiple type=... />:, dan lampirkan semua file yang dipilih ke formData dengan cara yang sama (misalnya photo2=...files[2];... formData.append("photo2", photo2);)
  • Anda dapat memasukkan data tambahan (json) ke permintaan misalnya let user = {name:'john', age:34}dengan cara ini:formData.append("user", JSON.stringify(user));
  • Solusi ini harus bekerja pada semua browser utama.
Kamil Kiełczewski
sumber
Bekerja dengan baik untukku.
Trieu Nguyen
formData === form kirimenctype="multipart/form-data"
xgqfrms
Saya mendapatkan kesalahannet::ERR_ABORTED 405 (Method Not Allowed)
Hidayt Rahman
@HidaytRahman err ini biasanya muncul ketika serwer tidak menerapkan metode POST untuk url Anda
Kamil Kiełczewski
1
Aneh - Sesuai pos Anda, saya berpikir kami tidak lagi membutuhkan server: D
Hidayt Rahman