Объект Vue axios FormData преобразует добавленные значения - PullRequest
1 голос
/ 01 апреля 2019

Я использую Axios для загрузки нескольких файлов и некоторых других вещей. Среди этого прочего есть массивы целых чисел (из флажков) и некоторые логические значения.

Сначала я попробовал это:

axios.post(this.route, {
    name: this.name,
    ...
    photos: this.photos
})

И все было прекрасно, за исключением того, что серверная часть получала фотографии в виде пустых объектов. Поэтому я попробовал следующее

let formData = new FormData()
formData.append('name', this.name)
...
for(let i = 0; i < this.photos.length; i++) {
     let photo = this.photos[i]

     formData.append('photos['+i+']', photo)
}
axios.post(this.route, formData)

И фотографии работали просто отлично, но другие данные, такие как массивы и логические значения из радиоприемников, начали работать неправильно. FormData превращает их в strin, и до того, как бэкэнд получал их как массивы и логические значения, я хочу этого. Я использую Laravel в качестве бэкэнда, и проверки не проходят этот путь.

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

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

Вот пример:

const fd = new FormData()

// Include file
fd.append('photo', file)

// Include JSON
fd.append('data', JSON.stringify({
  name: 'Bob',
  age: 20,
  registered: true,
})

axios.post('/users', fd)

На сервере вам также необходимо вручную выполнить JSON-анализ поля data, используя json_decode (извините, я не знаком с Laravel или PHP).

0 голосов
/ 01 апреля 2019

Мне удалось заставить данные форм отправлять данные так, как я хочу.Хотелось бы, чтобы был более простой способ, но вот что я сделал.

        let formData = new FormData()
        formData.append('name', this.name)
        formData.append('phone', this.phone)
        formData.append('email', this.email)
        formData.append('house_state', this.house_state)

        // The boolean values were passed as "true" or "false" but now I pass them as "0" or "1" which is strill a string but Laravel recognizes it as an indicator of true or false
        formData.append('has_lived_soon', this.has_lived_soon ? 1 : 0)
        formData.append('can_rent_now', this.can_rent_now ? 1 : 0)

        formData.append('beds_count', this.beds_count)
        formData.append('seasonality', this.seasonality)

        // Here's what I do for the arrays
        for(let extra of this.extras_values) {
            formData.append('extras[]', extra)
        }

        formData.append('estate_issues', this.estate_issues ? 1 : 0)
        formData.append('road_state', this.road_state)
        formData.append('usability', this.usability ? 1 : 0)

        for(let heating_method of this.heating_values) {
            formData.append('heating_methods[]', heating_method)
        }

        formData.append('heating_other', this.heating_other)
        formData.append('address', this.address)

        for(let i = 0; i < this.photos.length; i++) {
            let photo = this.photos[i]

            formData.append('photos['+i+']', photo)
        }

        axios.post(this.route, formData)
            .then(function(response) {
                console.log(response.data)
            })
            .catch(function(error) {
                app.errors = error.response.data.errors
            })
...