使用 laravel 和 inertiaJs 上传的文件更新数据时无法加载响应数据

Failed to load response data when updating data with file uploaded using laravel and inertiaJs

我正在使用 Laravel 8 和 inertiaJs

构建 SPA

我正在尝试更新已上传文件(输入文件)的记录。 存储数据时一切都很好,但是当我尝试 更新 并上传文件时出现问题。

PS: 控制台或服务器中没有显示错误。在网络选项卡中,我看到消息“加载响应失败”,结果,必填字段显示错误,就像我发送了空数据一样。

见图:Image showing the errors

这是我的代码:

web.php

Route::put('/software/{software}', [SoftwareController::class, 'update'])->name('software.update');

软件控制器

 public function update(Request $request, Software $software)
    {
        $data = $request->validate([
            'name' => 'required',
            'software_version' => 'nullable',
            'doc_ref' => 'nullable',
            'doc_version' => 'nullable',
            'doc_name' => 'required_with:doc_ref',
            'doc_filename' => 'nullable|file|mimes:docx,doc,xlsx,xls,pdf,jpg,png',
        ]);


        $doc_filename = $request->file('doc_filename') ? $request->file('doc_filename')->store('software/equipment', 'public') : null;
       
        $software->update(array_merge($data, ['doc_filename' => $doc_filename]));

        return Redirect::back()->with('success', 'Software updated.');
    }

Edit.vue

 updateSoftware(){
        if (confirm("Do you want to update the software ?")) {
            this.$inertia.put(this.route('software.update',
                {software : this.software_id}), this.form);
        } 
    },

PS:

this.form : 包含与 v-model

相关的数据

this.software_id : 包含当前实例的 id

您的问题很可能是您正在使用 PUT 方法,使用 multipart/form-data 请求的 HTML 表单默认不支持该方法,我敢打赌您正在使用 POST 存储正在工作的文件时。

尝试使用 post 添加,但将 <input type="hidden" name="_method" value="PUT"> 添加到您的表单中。

或者您可以将更新方法更改为:

 updateSoftware(){
        if (confirm("Do you want to update the software ?")) {
            this.$inertia.post(this.route('software.update',
                {software : this.software_id,
                 _method: 'put',
                }), this.form);
        } 
    },

查看文档here了解如何欺骗该方法。

并阅读 here 了解如何使用 Inertia 正确上传图片。