0

I have a ContactForm on my Vue.js app that is used to send emails to my Go backend, everything seems to be working fine except the file uploading.

This is the function that pushes the files to the form.

onFileChanged (e) {
  this.files = new FormData()
  for (let i in e.target.files) {
    if (e.target.files[i].type) {
      let file = e.target.files[i]
      this.form.files.push(file)
    }
  }
},

And this is the function that sends the data to my Backend

async sendMail () {
          try {
            await axios.post(process.env.API_URL + '/api/email',this.form, this.to)
            this.$awn.success(this.$t('message_sent'))
            this.error = false
            this.processed = false
            this.response = true
          } catch (e) {
            this.$awn.alert(e.response.data.message)
            this.error = true
            this.processed = false
          }
},

If I send the form without file attachments everything works fine.

When i attach one or multiple files and console.log the form, the files are present in the form data as an array but the files array in the request is empty.

Console logs of the form i'm sending to the API with axios.

enter image description here

Request payload :

{"busy":false,"successful":false,"errors":{"errors":{}},"originalData":{"subject":null,"to":null,"email":null,"message":null,"files":[],"allowedmedia":"gif,png,jpg,jpeg,ogg,mp3,flac,avi,mpg,mpeg,mkv,webm,pdf,txt,odt,ott,ods,ots,odp,otp,odg,otg","human":"test"},"subject":"test","to":"admin@domain.tld","email":"test@test.com","message":"test","files":[{},{}],"allowedmedia":"gif,png,jpg,jpeg,ogg,mp3,flac,avi,mpg,mpeg,mkv,webm,pdf,txt,odt,ott,ods,ots,odp,otp,odg,otg","human":""}

As you can see the files array in the request contains two empty objects [{},{}].

I don't understand what i did wrong here so any help will be greatly appreciated , thank you. If you need to see the GO code of the backend just let me know but i'm pretty sure i did something wrong on the frontend.

Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189

1 Answers1

0

You add content to FormData with the append method.

So your code should be something like this:

onFileChanged (e) {
  this.form = new FormData(); // maybe it's better to initialize your form outside of this function
  for (const file of e.target.files) {
    if (file.type) {
      this.form.append('files[]', file)
    }
  }
},

See also this answer.

CimChd
  • 191
  • 6
  • Thank you for your answer , i tried that but now the files are not even there when i console.log the form . – ArrowHeadDev Feb 19 '21 at 11:44
  • Probably an inconsitence with the variables. I changed this.form.files to this.files. I correct that in my answer. – CimChd Feb 19 '21 at 11:54