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 함수를 사용하지만 axios.post 메서드에서 헤더 json을 제거하면 플라스크 요청 객체의 양식 키에 문자열 값의 csv 목록이 표시됩니다 (파일은 .csv 임).

axios를 통해 파일 객체를 보내려면 어떻게해야합니까?


@Niklesh 예 오타 잘라 내기 및 붙여 넣기, 위에서 수정하고 코드에 큰 따옴표를 포함합니다.
돈 스마 이스

당신은 시도 않았다 v-on:change="uploadFile"으로 input대신 form태그?
Niklesh Raut

@Niklesh 나는 동일한 결과를 얻습니다-데이터는 문자열로 전송되고 플라스크의 request.files가 아닌 request.form에 의해 선택됩니다.
돈 스마 이스

답변:


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 라우트

7
이 게시물을 작성해 주셔서 감사합니다.하지만 FormData. Axios의의 문서에 따르면, 양 FileFormData처리됩니다 만 브라우저 두 가지 방법 (동일하게 볼 수 있도록 github.com/axios/axios#request-config가 )
히로키

대박 ! 나는 오류 412를 생성하는 'data : {data : formData}'를 보내고 있었다. 그것은 함께 일했다data:formData
Aseem

3
주의 : 스 니펫은 브라우저 컨텍스트에서 실행될 때있는 그대로 작동합니다. node.js에서 실행하려면 다음으로 계산 된 헤더를 전달해야합니다. formData.getHeaders()이것은 axios의 알려진 문제입니다. 예를 들어보십시오https://github.com/axios/axios/issues/789
mjv

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


: 여기 질문에 관련된 Axios의에서보고하도록 요청할 수 있습니다 stackoverflow.com/questions/59470085/...를 ?
Istiaque Ahmed

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' }는 옵션에서 서버 응답을받은 후 실제로 게시물을 보내는 유일한 방법이었습니다. 나는 아마도 뭔가 잘못하고 있지만 그것은 작동하고 있고 나는 그것을 내버려두고 lol
Jeff Bluemel

이것은 훌륭합니다! 나는 당신이 전체 양식을 보낼 수 있다고는 결코 생각하지 못했을 것입니다. 감사!
Dara Java
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.