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?


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:


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.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.