【发布时间】:2021-03-04 19:35:09
【问题描述】:
我正在使用 Laravel 8 和 Vue.js 制作一个表单,在该表单中我上传了两张图片(每张图片都进入不同的路径并通过不同的输入字段)。
我在网上冲浪,却一无所获。
我在 Google Chrome 开发工具 -> 网络 -> 预览中遇到的错误:
idback: "The idback must be a file of type: jpg, jpeg, png."
idfront: "The idfront must be a file of type: jpg, jpeg, png."
但我张贴成表格的文件是.jpg
我的 VerificationController.php 存储函数:
public function store(Request $request)
{
$request->validate([
'firstname' => 'required|min:2|max:255',
'lastname' => 'required|min:2|max:255',
'idfront' => 'required|mimes:jpg,jpeg,png|max:2048',
'idback' => 'required||mimes:jpg,jpeg,png|max:2048',
]);
if($request->hasFile('idfront') && $request->hasFile('idback')) {
$file_front = time().'.'.$request->file('idfront')->extension();
$file_back = time().'.'.$request->file('idback')->extension();
$request->file('idfront')->storeAs('user_verifications/front', $file_front);
$request->file('idback')->storeAs('user_verifications/back', $file_back);
$user = auth()->user();
$user = DB::table('users')->where('id', $user->id)->first();
$user->verified = "yes";
$user->save();
$verification = new Verification();
$verification->user_id = $user->id;
$verification->firstname = $request->input('firstname');
$verification->lastname = $request->input('lastname');
$verification->country = $request->input('country');
$verification->id_front_path = $file_front;
$verification->id_back_path = $file_back;
$verification->save();
DB:commit();
}
}
Verify.vue 文件,带有 axios 请求:
data() {
return {
verificationForm: this.$inertia.form({
firstname: '',
lastname: '',
country: 'USA',
options: [
{ text: 'United States', value: 'USA' },
{ text: 'United Kingdom', value: 'UK' },
{ text: 'Afghanistan', value: 'Afghanistan' },
{...},
],
idfront: '',
idback: '',
}, {
bag: 'createVerification',
resetOnSuccess: false,
}),
}
},
methods: {
createVerification() {
let formData = new FormData();
formData.append('idfront', idfront);
formData.append('idback', idback);
this.verificationForm.post('/user/verify',
formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
}
).then(function() {
console.log(idfront);
console.log(idback);
})
.catch(function() {
console.log(idfront);
console.log(idback);
});
},
handleFileUpload() {
const idfront = this.$refs.idfront.files[0];
const idback = this.$refs.idback.files[0];
}
}
}
还有标签:
<form @submit.prevent="$emit('submitted')" enctype="multipart/form-data">
Verify.vue 中的输入:
<jet-input-file id="idfront" type="file" ref="idfront" name="idfront" placeholder="Front side of ID" v-model="verificationForm.idfront" v-on:change="handleFileUpload()" />
<jet-input-error :message="verificationForm.error('idfront')" />
<jet-input-file id="idback" type="file" ref="idback" name="idback" placeholder="Back side of ID" v-model="verificationForm.idback" v-on:change="handleFileUpload()"/>
<jet-input-error :message="verificationForm.error('idback')" />
现在,我看到这是在 POST 请求中(所有其他输入均已正确提交,但没有正确提交):
idback: "C:\fakepath\6171500.jpg"
idfront: "C:\fakepath\32_d.jpg"
编辑后:它仍然会在我的请求中给我C:/fakepath/image.jpg 和C:/fakepath/image2.jpg(并抛出状态 302),并且在开发控制台中会显示这个:
【问题讨论】:
-
您确定您的表单提交正确吗?检查浏览器开发窗格中的网络选项卡并检查帖子的内容。
-
@MaartenVeerman 我发现了问题,但我不知道代码中的正确解决方案。我还用这些信息编辑了帖子。
标签: php laravel vue.js laravel-8 inertiajs