Vue axios FormData 对象转换附加值
Vue axios FormData object transforms appended values
我正在使用 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 作为后端,但验证没有通过这种方式。
如果您想上传文件 和 其他结构化 JSON 数据,那么您将需要手动 JSON-stringify 所有其他数据以及文件。
这是一个例子:
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-使用 json_decode
解析 data
字段(抱歉,我不熟悉 Laravel 或 PHP).
我设法让表单数据按照我想要的方式发送数据。我希望有更简单的方法,但这是我所做的。
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
})
我正在使用 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 作为后端,但验证没有通过这种方式。
如果您想上传文件 和 其他结构化 JSON 数据,那么您将需要手动 JSON-stringify 所有其他数据以及文件。
这是一个例子:
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-使用 json_decode
解析 data
字段(抱歉,我不熟悉 Laravel 或 PHP).
我设法让表单数据按照我想要的方式发送数据。我希望有更简单的方法,但这是我所做的。
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
})