Laravel $request->file() 返回 null

2022-08-30 10:59:44

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

问题

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

设置

我使用超级代理构建了一个AJAX请求,调试了请求,一切似乎都很好。这些更改取决于我添加的图像,表示图像已添加到请求中。也设置为 。Content-LengthContent-Typemultipart/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中获取文件。使用 returns,但是如果我调试数组,我注意到我的文件已被上传。$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-Typeapplication/octet-stream

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


答案 1

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

例如:

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

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

我希望这可以你帮助!


答案 2

注意到我在 Controller 方法中接收的对象是 的实例,它是扩展 的自定义类(现在为空)。$requestJsonRequestIlluminate\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

但我不明白为什么/如何用空的类来扩展东西。
有人可以解释吗?Illuminate\Http\Request

我对子类化的意图是能够附加方法,以便以统一的方式处理API请求的异常/错误。例如,在部署中显示异常消息,但在生产中返回固定消息。
有没有不同/更好/更Laravel的方式来做到这一点?
我认为只会创建一个JsonController而不是扩展请求。Illuminate\Http\Request$requests


推荐