JavaScript: Dosya yükle


190

Diyelim ki sayfada bu öğe var:

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

Bu, web sayfası kullanıcılarının tarayıcıdaki bir OS "Dosya aç ..." iletişim kutusu aracılığıyla bir dosya seçmesine izin veren bir düğme oluşturur.

Kullanıcının söz konusu düğmeyi tıkladığını, iletişim kutusunda bir dosya seçtiğini ve ardından iletişim kutusunu kapatmak için "Tamam" düğmesini tıkladığını varsayalım.

Seçilen dosya adı artık şu konumda saklanıyor:

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

Şimdi sunucunun "/ upload / image" URL'sinde çok parçalı POST'ları işlediğini varsayalım.

Dosyayı "/ upload / image" adresine nasıl gönderirim?

Ayrıca, dosyanın yüklenmesi bittiğini bildiren bildirimleri nasıl dinlerim?


2
JavaScript, sunucu tarafı olduğu için yüklemeleri işlemiyor. Sunucu tarafı komut dosyası dosyayı alır ve sonra taşır. Geçici klasörden istenen klasöre php için.
Baküdan


15
Soru jQuery değil POJS (düz eski javascript) ile ilgili olduğu için yeniden açılmak için seçildi.
e2-e4

Yanıtlar:


95

Eğer ajax kullanarak dosyayı yüklemeye çalışıyor sürece, sadece formu göndermek için /upload/image.

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

Görüntüyü arka planda yüklemek istiyorsanız (örneğin, formun tamamını göndermeden), ajax'ı kullanabilirsiniz:


veya src = "" içinde resim yükleyici komut dosyası içeren iframe 0x0 boyutunda ve formu hedef = "iframeId" kullanarak, örneğin jQuery kullanarak bağlanabilen iframe src .load olayında okuyarak formu gönderin.
Dmitry

11
Bugünlerde Javascript ve Ajax üzerinden oy kullanmak gerçekten mümkün, bkz: stackoverflow.com/a/10811427/694469 (Ben aşağı oy vermedim).
KajMagnus

35
@KajMagnus, muhtemelen 'upload' demek istediniz, ancak yanlışlıkla 'upvote' dediniz
Samuel Allan

85

Saf JS

Sen kullanabilirsiniz getirme bekliyoruz-try-catch, isteğe

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

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

Eski okul yaklaşımı - 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);

ÖZET

  • Sunucu tarafında, tarayıcı tarafından filenameformData parametresinde isteğe göre otomatik olarak dahil edilen orijinal dosya adını (ve diğer bilgileri) okuyabilirsiniz.
  • Sen seti istek başlığında gerekmediğini Content-Typeiçin multipart/form-data- bu tarayıcı tarafından otomatik olarak ayarlanacaktır.
  • Bunun yerine /upload/imagetam adresi kullanabilirsiniz http://.../upload/image.
  • Tek bir istekte çok sayıda dosya göndermek istiyorsanız, multipleözniteliği kullanın : <input multiple type=... />ve seçilen tüm dosyaları formData'ya benzer şekilde ekleyin (örneğin photo2=...files[2];... formData.append("photo2", photo2);)
  • Örneğin let user = {name:'john', age:34}şu şekilde talep etmek için ek veriler (json) ekleyebilirsiniz :formData.append("user", JSON.stringify(user));
  • Bu çözümler tüm büyük tarayıcılarda çalışmalıdır.

Benim için mükemmel çalış.
Trieu Nguyen

formData === form göndermeenctype="multipart/form-data"
xgqfrms

Hata alıyorumnet::ERR_ABORTED 405 (Method Not Allowed)
Hidayt Rahman

@HidaytRahman bu hata genellikle sunucu url'niz için POST yöntemi uygulamadığında görünür
Kamil Kiełczewski

1
Tuhaf -
Başınıza göre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.