如何在 Laravel API 中使用 PUT 方法进行文件上传

How to use PUT method in Laravel API with File Upload

已阅读此 SO link,

PUT 最常用于更新功能,PUT 到已知资源 URI,请求正文包含原始资源的最新更新表示。

From this answer,

... we need to send all the parameters of the data again.

在我的控制器中,我有:

$student = Student::find($student_id);
$student->username = $request->username;
$student->email = $request->email;
$student->password = $request->password;
$path = $request->file('passport')->store('upload');
$student->passport = $path;

我曾经将相同的代码用于 POST 方法并且它有效,但是在将它用于 API 时,我使用了 POSTMAN form-data 并得到 $request->all()null.有人说我应该使用 x-www-form-urlencoded 但这不允许文件上传。

这实际上是一个incapability of PHP itself。带有 multipart/form-data 的 PUT/PATCH 请求仅 不会 填充 $_FILES,因此 Laravel 没有任何作用。

每隔一段时间,人们会在发现 $request->all() returns 空值时报告错误 like this,认为这是 Laravel 的错,但是 Laravel 没办法。

文件最好作为 multipart/form-data 发送,如果是 [=38=,则此类请求将 填充 $_FILES ]。没有$_FILES,没有$request->file().

代替在 PHP 中按预期工作,如果它使用 POST 工作,只需使用 POST。

当表单包含上传的文件时,它仅适用于 POST 方法 - 可能是 PHP/Laravel

的问题

如果有人想对包含文件上传的表单使用 PUT 或 PATCH 请求

<form action="/foo/bar" method="POST">
    @method('PUT')

    ...
</form>

通过任何 javascript 框架,例如 vue

let data = new FormData;
data.append("_method", "PUT")

axios.post("some/url", data)

使用_method并将其设置为'PUT'或'PATCH'将允许将路由声明为PUT路由并且仍然使用POST请求提交表单数据

我回答过类似的问题