Axios ile bir formdan dosya nasıl gönderilir


130

Aşağıdakileri kullanarak bir flask sunucusuna bir dosya gönderirken ham HTML kullanarak, küresel balon isteğinden dosyalara erişebilirim:

<form id="uploadForm" action='upload_file' role="form" method="post" enctype=multipart/form-data>
    <input type="file" id="file" name="file">
    <input type=submit value=Upload>
</form>

Şişede:

def post(self):
    if 'file' in request.files:
        ....

Axios ile aynı şeyi yapmaya çalıştığımda, küresel balon talebi boş:

<form id="uploadForm" enctype="multipart/form-data" v-on:change="uploadFile">
<input type="file" id="file" name="file">
</form>

uploadFile: function (event) {
    const file = event.target.files[0]
    axios.post('upload_file', file, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
    })
}

Yukarıdaki aynı uploadFile işlevini kullanırsam ancak json başlıklarını axios.post yönteminden kaldırırsam, flask istek nesnemin form anahtarına bir csv dize değerleri listesi alırım (dosya bir .csv dosyasıdır).

Axios aracılığıyla gönderilen bir dosya nesnesini nasıl alabilirim?


@Niklesh evet yazım hatası kesme ve yapıştırma, yukarıda düzelttim, kodda çift tırnak var.
Don Smythe

Eğer çalıştı vermedi v-on:change="uploadFile"ile inputyerine formetiketi?
Niklesh Raut

@Niklesh Aynı sonucu alıyorum - dize olarak gönderilen ve request.form tarafından alınan veriler istek değil, flask dosyasında.
Don Smythe

Yanıtlar:


272

Dosyayı bir formDatanesneye ekleyin ve Content-Typebaşlığı olarak ayarlayın multipart/form-data.

var formData = new FormData();
var imagefile = document.querySelector('#file');
formData.append("image", imagefile.files[0]);
axios.post('upload_file', formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
})

1
Dosyaları gönderdikten sonra. Bunlara HTTP isteğinden mi erişmemiz yoksa sunucu tarafındaki parametrelerden mi erişmemiz gerekiyor?
Parth Patel

@ParthPatel: PHP'yi kullandığım $_FILESiçin sunucu tarafında dosya almak için kullanıyorum
Niklesh Raut

7
Bu gönderi için teşekkürler, ama neden ihtiyacımız olduğunu hala anlamıyorum FormData. AXIOS en doc göre her iki Fileve FormDataolarak kabul edilir sadece Tarayıcı her iki yönde (eşit görülebilir, böylece github.com/axios/axios#request-config )
Hiroki

Harika! 412 hatası oluşturan 'data: {data: formData}' gönderiyordum. Çalıştıdata:formData
Aseem

3
DİKKAT: Snippet, bir tarayıcı bağlamında çalıştırıldığında olduğu gibi çalışır. Node.js'de çalıştırmak için, kişi tarafından hesaplanan başlıkları iletmek gerekir. formData.getHeaders()Bu, axios ile bilinen bir sorundur; örneğin bkz.https://github.com/axios/axios/issues/789
mjv

13

Vue kullanarak örnek uygulama. İsteği işlemek için localhost üzerinde çalışan bir arka uç sunucusu gerektirir:

var app = new Vue({
  el: "#app",
  data: {
    file: ''
  },
  methods: {
    submitFile() {
      let formData = new FormData();
      formData.append('file', this.file);
      console.log('>> formData >> ', formData);

      // You should have a server side REST API 
      axios.post('http://localhost:8080/restapi/fileupload',
          formData, {
            headers: {
              'Content-Type': 'multipart/form-data'
            }
          }
        ).then(function () {
          console.log('SUCCESS!!');
        })
        .catch(function () {
          console.log('FAILURE!!');
        });
    },
    handleFileUpload() {
      this.file = this.$refs.file.files[0];
      console.log('>>>> 1st element in files array >>>> ', this.file);
    }
  }
});

https://codepen.io/pmarimuthu/pen/MqqaOE


Burada aksiyolarla ilgili bir soruya bir göz atmanızı isteyebilir miyim: stackoverflow.com/questions/59470085/… ?
Istiaque Ahmed

5

Bu benim için çalışıyor, umarım birine yardımcı olur.

var frm = $('#frm');
let formData = new FormData(frm[0]);
axios.post('your-url', formData)
    .then(res => {
        console.log({res});
    }).catch(err => {
        console.error({err});
    });

Nuxt kullanarak - bu nihayet benim için çalıştı. kaldırma headers: { 'Content-Type': 'multipart/form-data' }, seçeneklerden bir sunucu yanıtı aldıktan sonra gönderiyi gerçekten göndermenin tek yoluydu. Muhtemelen yanlış bir şey yapıyorum, ama çalışıyor ve onu yalnız bırakıyorum lol
Jeff Bluemel

Bu harika! Formun tamamını gönderebileceğini asla düşünmezdim. Teşekkürler!
Dara Java
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.