Как отправить почту с несколькими вложенными файлами

У меня есть ContactForm в моем приложении Vue.js, которое используется для отправки электронных писем на мой сервер Go, похоже, все работает нормально, кроме загрузки файлов.

Это функция, которая помещает файлы в форму.

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

И это функция, которая отправляет данные на мой 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
          }
},

Если я отправлю форму без файловых вложений, все будет нормально.

Когда я прикрепляю один или несколько файлов и console.log к форме, файлы присутствуют в данных формы в виде массива, но массив файлов в запросе пуст.

Журналы консоли в форме, которую я отправляю в API с помощью axios.

Запросить полезную нагрузку:

      {"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":""}

Как видите, массив файлов в запросе содержит два пустых объекта [{},{}].

Я не понимаю, что я здесь сделал не так, поэтому будем благодарны за любую помощь. Если вам нужно увидеть код GO бэкэнда, просто дайте мне знать, но я почти уверен, что сделал что-то не так во фронтенде.

1 ответ

Вы добавляете контент в FormData с помощью метода append .

Итак, ваш код должен быть примерно таким:

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

См. Также этот ответ .

Другие вопросы по тегам