Laravel $ request-> file()返回null

时间:2016-07-06 14:42:14

标签: php laravel file-upload

无法在后端使用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

以下已回答了问题。

3 个答案:

答案 0 :(得分:20)

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

例如:

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

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

我希望你能帮忙!

答案 1 :(得分:4)

注意到我在Controller方法中收到的$request对象是JsonRequest的实例,这是一个自定义类(现在为空),它扩展了{{ 1}}。

它实现为:

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会破坏事物   有人可以解释一下吗?

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

答案 2 :(得分:0)

我仅在服务器上遇到此问题。图像存储在$_FILES变量中,该变量指向php.ini文件中的物理目录。确保您对该目录具有正确的权限。

php.ini:

upload_tmp_dir = /Applications/MAMP/tmp/php