使用 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 正确上传图片。
我正在使用 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 正确上传图片。