Laravel 提交包含图像和数据的表单时显示所需的错误消息
Laravel show required error message when submitting the form with image and data both
大约
我正在使用 vue.js 和 Laravel 5.8 提交纯文本图像。
错误详情
当我使用 axios 提交数据时,它给出了需要产品名称的验证错误消息。我正在提交名称和图像。 当我禁用提交图片的代码时一切正常。
Request Header - 请点击图片查看更多详情
Payload - 请点击图片查看更多详情
Html
<template>
<div>
<input name="Product Name" type="text" v-model="saveForm.product_name">
<input type="file" accept="image/*" name="product_image" />
<button type="button" @click="store()">Save</button>
</div>
</template>
脚本
<script>
export default {
data() {
return {
saveForm: {
product_name: '', product_image: null
}
};
},
methods: {
store() {
var config = {
headers : {
'Content-Type': 'multipart/form-data', 'processData': false
}
};
var fileData = new FormData();
fileData.append("product_image", this.saveForm.product_image);
fileData.append("product_name", this.saveForm.product_name);
axios.post("my route", this.saveForm, config).then(response => {
if(response.data.Status) {}
})
.catch(error => { //console.log(error);
});
}
}
}
</script>
Laravel 控制器动作方法
public function Create(CreateProductRequest $request) {
//Code here
}
Laravel请求class
class CreateProductRequest extends Request
{
public function wantsJson() {
return true;
}
public function rules() {
return [
'product_name' => 'required',
'product_image' => "image|mimes:bmp,png,jpg,gif,jpeg"
];
}
}
好的,让我们逐步检查您的代码。
1) 您需要将 "boundary" 添加到 header。它虽然不重要,但对服务器来说是必需的。
headers: {
"Content-type":
"multipart/form-data; charset=utf-8; boundary=" +
Math.random()
.toString()
.substr(2),
processData: false,
Accept: "application/json"
}
2) 为什么通过"new FormData()"准备数据,却用"this.saveForm"发送?正确代码:
axios.post("my route", fileData, config)
.then(response => {
if (response.data.Status) {}
})
.catch(error => { //console.log(error);
});
3) 当你按照我上面说的做所有事情时,你会得到图像错误,因为你没有通过它。我添加了发送图片的功能。
总结:
Html
<div>
<input
name="Product Name"
type="text"
v-model="saveForm.product_name"
>
<input
type="file"
accept="image/*"
name="product_image"
@change="uploadImage"
/>
<button
type="button"
@click="store()"
>Save</button>
</div>
脚本
export default {
data() {
return {
saveForm: {
product_name: "",
product_image: null
}
};
},
methods: {
store() {
var config = {
headers: {
"Content-type":
"multipart/form-data; charset=utf-8; boundary=" +
Math.random()
.toString()
.substr(2),
processData: false,
Accept: "application/json"
}
};
var fileData = new FormData();
fileData.append("product_image", this.saveForm.product_image);
fileData.append("product_name", this.saveForm.product_name);
axios
.post("my route", fileData, config)
.then(response => {
if (response.data.Status) {
}
})
.catch(error => {
console.log(error);
});
},
uploadImage(e) {
this.saveForm.product_image = e.target.files[0];
}
}
};
大约
我正在使用 vue.js 和 Laravel 5.8 提交纯文本图像。
错误详情
当我使用 axios 提交数据时,它给出了需要产品名称的验证错误消息。我正在提交名称和图像。 当我禁用提交图片的代码时一切正常。
Request Header - 请点击图片查看更多详情
Payload - 请点击图片查看更多详情
Html
<template>
<div>
<input name="Product Name" type="text" v-model="saveForm.product_name">
<input type="file" accept="image/*" name="product_image" />
<button type="button" @click="store()">Save</button>
</div>
</template>
脚本
<script>
export default {
data() {
return {
saveForm: {
product_name: '', product_image: null
}
};
},
methods: {
store() {
var config = {
headers : {
'Content-Type': 'multipart/form-data', 'processData': false
}
};
var fileData = new FormData();
fileData.append("product_image", this.saveForm.product_image);
fileData.append("product_name", this.saveForm.product_name);
axios.post("my route", this.saveForm, config).then(response => {
if(response.data.Status) {}
})
.catch(error => { //console.log(error);
});
}
}
}
</script>
Laravel 控制器动作方法
public function Create(CreateProductRequest $request) {
//Code here
}
Laravel请求class
class CreateProductRequest extends Request
{
public function wantsJson() {
return true;
}
public function rules() {
return [
'product_name' => 'required',
'product_image' => "image|mimes:bmp,png,jpg,gif,jpeg"
];
}
}
好的,让我们逐步检查您的代码。
1) 您需要将 "boundary" 添加到 header。它虽然不重要,但对服务器来说是必需的。
headers: {
"Content-type":
"multipart/form-data; charset=utf-8; boundary=" +
Math.random()
.toString()
.substr(2),
processData: false,
Accept: "application/json"
}
2) 为什么通过"new FormData()"准备数据,却用"this.saveForm"发送?正确代码:
axios.post("my route", fileData, config)
.then(response => {
if (response.data.Status) {}
})
.catch(error => { //console.log(error);
});
3) 当你按照我上面说的做所有事情时,你会得到图像错误,因为你没有通过它。我添加了发送图片的功能。
总结:
Html
<div>
<input
name="Product Name"
type="text"
v-model="saveForm.product_name"
>
<input
type="file"
accept="image/*"
name="product_image"
@change="uploadImage"
/>
<button
type="button"
@click="store()"
>Save</button>
</div>
脚本
export default {
data() {
return {
saveForm: {
product_name: "",
product_image: null
}
};
},
methods: {
store() {
var config = {
headers: {
"Content-type":
"multipart/form-data; charset=utf-8; boundary=" +
Math.random()
.toString()
.substr(2),
processData: false,
Accept: "application/json"
}
};
var fileData = new FormData();
fileData.append("product_image", this.saveForm.product_image);
fileData.append("product_name", this.saveForm.product_name);
axios
.post("my route", fileData, config)
.then(response => {
if (response.data.Status) {
}
})
.catch(error => {
console.log(error);
});
},
uploadImage(e) {
this.saveForm.product_image = e.target.files[0];
}
}
};