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 无法处理的实体

Angular + Rails:POST 请求 422/CSRF 错误

Rails API 422 无法处理的实体:没有可用的验证密钥,heroku