【问题标题】:Laravel $request->file() returns nullLaravel $request->file() 返回 null
【发布时间】:2016-11-08 16:11:10
【问题描述】:

尝试在后端使用 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

以下已回答问题。

【问题讨论】:

    标签: php laravel file-upload


    【解决方案1】:

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

    例如:

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

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

    希望对你有帮助!

    【讨论】:

    • 我在看这个答案,我以为我有它,但我有两个文件 - 一个用于创建,另一个用于编辑屏幕。因此,几个小时后,我再次看到了这个答案,并意识到我应该仔细检查,这正是问题所在。我很笨XD
    • 即使经过多年的经验,我也需要有人提醒我添加这个:D
    【解决方案2】:

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

    它的实现方式为:

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

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

    【讨论】:

    • 尝试添加一个构造函数,以便您可以将JsonRequestRequest 链接
    • 你在方法中注入Request了吗?
    • @AniruddhaChakraborty 我该怎么做?好吧,我开始发现app/Http/Requests 主要用作FormRequests 以从控制器中删除验证。但是对于JsonRequest,我希望$request 实例具有处理异常和返回错误消息的附加消息。
    【解决方案3】:

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

    php.ini:

    upload_tmp_dir = /Applications/MAMP/tmp/php

    【讨论】:

      【解决方案4】:

      检查您的php.ini 设置:

      • file_uploads
      • upload_max_filesize
      • max_file_uploads

      我关闭了我的。我想这会让它悄悄地清除文件。

      或运行php -i | grep --color=always upload 来检查您当前的设置。

      【讨论】:

        猜你喜欢
        • 2018-04-21
        • 1970-01-01
        • 2021-08-12
        • 2021-05-04
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 2022-01-27
        相关资源
        最近更新 更多