Laravel $ request-> file()返回null

Ren*_*nis 21 php file-upload laravel

在后端使用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
Run Code Online (Sandbox Code Playgroud)

但是我无法在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())
// []
Run Code Online (Sandbox Code Playgroud)

什么可能导致Laravel忽略该文件?
Content-Type输入文件不是application/octet-stream

以下回答了这个问题.

Car*_*nes 35

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

例如:

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

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

我希望你能帮忙!

  • 即使经过多年的经验,我也需要有人提醒我添加这个:D (4认同)

Ren*_*nis 6

请注意,$request我在 Controller 方法中接收的对象是 Instance of JsonRequest,它是一个扩展的自定义类(目前为空Illuminate\Http\Request

它的实现方式为:

<?php

namespace App\Http\Requests;

use Illuminate\Http\Request;

class JsonRequest extends Request {
}
Run Code Online (Sandbox Code Playgroud)

但如果我改变:

// 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
  //   ...
  // }
}
Run Code Online (Sandbox Code Playgroud)

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

但我不明白为什么/如何扩展Illuminate\Http\Request空类会破坏事情。
有人可以解释一下吗?

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