Laravel $request->file() 返回 null

新手上路,请多包涵

尝试在后端使用 Laravel 上传文件时遇到问题。

问题

Laravel $request->file() 方法返回 null。

设置

我使用 superagent 建立了一个 AJAX 请求,调试了请求,一切似乎都很好。 Content-Length 根据我添加的图像而变化,表明图像已添加到请求中。 Content-Type 也设置为 multipart/form-data

 // request headers
Content-Length:978599
Content-Type:multipart/form-data;

// request payload
Content-Disposition: form-data; name="files"; filename="item-keymoment.png"
Content-Type: image/png

但是我无法在 Laravel 中获取文件。使用 $request->file('files') 返回 NULL ,但是如果我调试 $_FILES 数组,我注意到我的文件已上传。

 dd($request->file('files'))
// NULL

dd($_FILES);
// array:1 [
//   "files" => array:5 [
//     "name" => "item-keymoment.png"
//     "type" => "image/png"
//     "tmp_name" => "/tmp/phpipbeeM"
//     "error" => 0
//     "size" => 978274
//   ]
// ]

dd($request->files->all())
// []

什么可能导致 Laravel 忽略该文件?

Content-Type 输入文件不是 application/octet-stream

下面已经回答了这个问题。

原文由 Renārs Vilnis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

注意到我在 Controller 方法中收到的 $request 对象是 JsonRequest 的一个实例,它是一个扩展 Illuminate\Http\Request 的自定义类( _现在为空_)。

它被实现为:

 <?php

namespace App\Http\Requests;

use Illuminate\Http\Request;

class JsonRequest extends Request {
}

但如果我改变:

 // from
use App\Http\Requests\JsonRequest;
public function add_background_image (JsonRequest $request) {
  dd($request->file('files'))
  // NULL
}

// to
use Illuminate\Http\Request;
public function add_background_image (Request $request) {
  dd($request->file('files'))
  // UploadedFile {#266
  //   -test: false
  //   -originalName: "item-keymoment.png"
  //   -mimeType: "image/png"
  //   -size: 978274
  //   -error: 0
  //   ...
  // }
}

我得到了所需的输入文件。现在切换 $request 的实例解决了我的问题

但我不明白为什么/如何用空的 Class 扩展 Illuminate\Http\Request 会破坏事情。

有人可以解释吗?

我的子类 Illuminate\Http\Request 的意图是能够在 $requests 上附加方法,以便以统一的方式处理 API 请求的异常/错误。例如在部署时显示异常消息,但在生产中返回固定消息。

有不同/更好/更多的 Laravel 方式吗?

我认为只会创建一个 JsonController 而不是扩展请求。

原文由 Renārs Vilnis 发布,翻译遵循 CC BY-SA 3.0 许可协议

您应该添加到表单标签 enctype="multipart/form-data"

例如:

 <form method="POST" action="{{route('back.post.new')}}" enctype="multipart/form-data">
.............
</form>

添加它,您可以使用您的自定义请求。

我希望这可以帮助你!

原文由 CarlosYanes 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题