Search code examples
vue.jsvuejs2vue-componentquasar-frameworkquasar

Quasar upload file from axios


I have a form with multiple inputs that includes file input too. Now, I want to pass these data on the onSubmit function. but, there is an issue, in the quasar documentation, I didn't see instruction about file upload by Axios in the script part. I read Uploader in the quasar doc and also I read this one from Stackoverlow, But I didn't work for me.

Also, this is my templates code:

<template>
  <div class="q-pa-md q-mt-md">
    <q-card class="my-card">
      <q-form
        @submit="onSubmit"
        class="q-gutter-md"
      >
        <div class="row justify-center">
          <q-uploader
            label="Upload your music"
            color="purple"
            accept=".mp3"
            :max-file-size="20000000"
            square
            flat
            @add="file_selected"
            bordered
          />
        </div>
        <div class="row justify-center">
          <q-btn label="Edit" type="submit" color="primary" v-if="song_id" class="q-ma-md" />
          <q-btn label="Add" type="submit" color="primary" v-else class="q-ma-md" />
          <q-btn label="Cancel" type="reset" color="primary" flat class="q-ml-sm" />
        </div>
      </q-form>
    </q-card>
  </div>
</template>

And the methods part:

file_selected: function (file) {
  console.log(file)
  this.selected_file = file[0]
  this.check_if_document_upload = true
},
onSubmit: function () {
  const url = '/core/v1/api/songs/upload'
  const fileData = new FormData()
  fileData.append('file_data', this.selected_file)
  fileData.append('song_id', this.song_id)
  this.$axios.post(url, fileData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  }).then(function () {
    console.log('SUCCESS!!')
  })
    .catch(function () {
      console.log('FAILURE!!')
    })

And data part:

data: () => ({
    selected_file: '',
    check_if_document_upload: false,
    song_id: '',
    song_data: {
      status: true
    },
    dashData: []
  }),

Solution

  • I found my issue. I should change @add to @added in the template.

    <template>
      <div class="q-pa-md q-mt-md">
        <q-card class="my-card">
          <q-form
            @submit="onSubmit"
            class="q-gutter-md"
          >
            <div class="row justify-center">
              <q-uploader
                label="Upload your music"
                color="purple"
                accept=".mp3"
                :max-file-size="20000000"
                square
                flat
                @added="file_selected"
                bordered
              />
            </div>
            <div class="row justify-center">
              <q-btn label="Edit" type="submit" color="primary" v-if="song_id" class="q-ma-md" />
              <q-btn label="Add" type="submit" color="primary" v-else class="q-ma-md" />
              <q-btn label="Cancel" type="reset" color="primary" flat class="q-ml-sm" />
            </div>
          </q-form>
        </q-card>
      </div>
    </template>