Як опублікувати файл із форми за допомогою Axios


129

Використовуючи необроблений HTML, коли я публікую файл на сервері колби, використовуючи наступні, я можу отримати доступ до файлів із глобального запиту колби:

<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>

У колбі:

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

Коли я намагаюся зробити те ж саме з Axios, глобальний запит у колбі порожній:

<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'
        }
    })
}

Якщо я використовую ту саму функцію uploadFile вище, але видаляю заголовки json з методу axios.post, я отримую у вигляді ключа мого запиту на колбу об'єкт csv списку значень рядків (файл - .csv).

Як я можу отримати об’єкт файлу, надісланий через axios?


@Niklesh так друкарське вирізання та вклеювання, я виправив це вище, включає подвійні лапки в код.
Дон Сміт

Ви намагалися v-on:change="uploadFile"з inputзамість formтега?
Niklesh Raut

@Niklesh Я отримую той самий результат - дані надсилаються як рядки та підбираються request.form not request.files у колбі.
Дон Сміт

Відповіді:


270

Додайте файл до formDataоб’єкта та встановіть Content-Typeзаголовок 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
Після публікації файлів. Чи потрібно нам отримувати доступ до них із HTTP-запиту чи потрібно мати доступ до них із параметрів на стороні сервера.
Parth Patel

@ParthPatel: Я використовую $_FILESдля отримання файлів на стороні сервера, оскільки я використовую PHP
Niklesh Raut

7
Дякую за цю посаду, але я досі не бачу, навіщо нам це потрібно FormData. Згідно з документом axios, обидва Fileі FormDataтрактуються лише як браузер , тому обидва способи можна побачити однаково ( github.com/axios/axios#request-config )
Хірокі

Дивовижно! Я відправляв «дані: {дані: FormData}» , який генерував помилку 412. Він працював зdata:formData
Асім

3
УВАГА: фрагмент працює як є при запуску в контексті веб-переглядача. Щоб запустити node.js, потрібно пропустити заголовки, обчислені formData.getHeaders()Це відома проблема з axios; див. наприкладhttps://github.com/axios/axios/issues/789
mvv

13

Зразок програми за допомогою Vue. Для обробки запиту потрібен сервер запущеного сервера, який працює на localhost:

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


Чи можу я попросити вас ознайомитись із питанням, пов’язаним з аксіосами тут: stackoverflow.com/questions/59470085/… ?
Істіаке Ахмед

5

Це працює для мене, сподіваюся, комусь допомагає.

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 - це нарешті спрацювало для мене. видалення headers: { 'Content-Type': 'multipart/form-data' }було єдиним способом фактично надіслати повідомлення після отримання відповіді сервера від параметрів. Я, мабуть, роблю щось не так, але це працює, і я залишаю його в спокої
хаха

Це геніально! Я б ніколи не думав, що ти можеш надіслати всю форму. Дякую!
Дара Ява
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.