422 无法处理的实体错误。我尝试上传 Excel 文件以导入数据,但它不工作
Posted
技术标签:
【中文标题】422 无法处理的实体错误。我尝试上传 Excel 文件以导入数据,但它不工作【英文标题】:422 Unprocessable Entity Error. I tried upload Excel file to import data but it is not working 【发布时间】:2022-01-10 15:21:15 【问题描述】:这是我的代码,我使用 vuejs 和 laravel。我正在做的功能是保存课程并导入 Excel 文件以获取文件中的数据。但是在保存Course的时候是正常的,但是在运行validate excel文件行的时候就没有报错。即使我给它起了一个名字,console.log 也出来了。你能帮我修一下吗?非常感谢。
组件 - 模板标签
<form @submit.prevent="store()" @keydown="form.onKeydown($event)">
<div class="form-group">
<label class="form-label">Courses</label>
<select class="form-control" name="education_program_course" v-model="form.education_program_course">
<option value="" disabled selected="">Select option</option>
<option value="" disabled>-------</option>
<option v-for="course in courses" :key="course.course_code" :value="course.course_code"> course.course_name </option>
</select>
</div>
<div class="form-group">
<label class="form-label">Excel File</label>
<input type="file" class="form-control" id="file_data" name="file_data" ref="fileupload" @change="onFileChange">
</div>
<div class="card-footer text-right">
<button :disabled="form.busy" class="btn btn-success btn-lg mt-1" type="submit">Save</button>
</div>
</form>
组件 - 脚本标签
export default:
data()
return
file_data: "",
form: new Form(
education_program_course
),
,
methods:
onFileChange(e)
this.file_data = e.target.files[0];
,
store()
this.form.busy = true;
let formData = new FormData();
formData.append('file_data', this.file_data);
this.form.post('../../api/admin/program/education', formData,
headers: 'content-type': 'multipart/form-data'
)
.then(res =>
if(this.form.successful)
this.$snotify.success('Sucessful!');
this.form.clear();
this.form.reset();
)
.catch(err =>
this.$snotify.error(err.response.data.errors.file_data[0]);
);
,
控制器
$data = $request->validate([
'education_program_course' => ['required'],
'file_data' => ['required', 'file', 'mimes:xls,xlsx']
]);
$program = new EducationProgram();
$program->education_program_course = $data['education_program_course'];
$path = $request->file($data['file_data'])->getRealPath();
Excel::import(new ProgramDetailImport, $path);
【问题讨论】:
@guyg 我只是将 file_data 发送到 formData 因为 education_program_course 已经在 this.form 中可用了 【参考方案1】:您应该在表单数据上附加“education_program_course”。
formData.append('education_program_course', this.form.education_program_course);
【讨论】:
我认为education_program_course 已经在this.form 中提供了 从浏览器网络控制台检查您的验证错误 我检查了一下,它说需要验证错误。但是当我检查console.log(this.file_data)
时,它仍然显示该文件数据。【参考方案2】:
我已经解决了这个问题。在脚本标签处更改更改 -> store()
来自:
let formData = new FormData();
formData.append('file_data', this.file_data);
到:
if(document.getElementById("file_data").files[0])
this.form.file_data = document.getElementById("file_data").files[0];
在form: new Form
中添加file_date
并在this.form.post
中删除formData
。
【讨论】:
你能澄清一下你的解释吗?您所说的“在脚本标签-> store() 处更改更改”是什么意思?这似乎并没有反映在您的实际建议中。我是不是误会了?如果是这样,其他人也可以。以上是关于422 无法处理的实体错误。我尝试上传 Excel 文件以导入数据,但它不工作的主要内容,如果未能解决你的问题,请参考以下文章
在“422(无法处理的实体)”Laravel 7 中验证错误时出现错误
无法将附件传递给控制器:422 Unprocessable Entity
如何反序列化 422 无法处理的实体错误模型并将错误绑定到 asp.net core razor pages 模型状态
Paypal 创建支付令牌 API 返回 422 无法处理的实体