如何在 laravel 规则中获取上传文件的内容?

How do I get the contents of an uploaded file in a laravel rule?

我正在尝试为上传的文件做一些自定义验证逻辑,所以我创建了一个 Rule 并开始编辑 passes() 方法。但是 $value 只包含上传文件的基本名称。

如何获取文件内容或上传文件的完整路径以便验证内容?

这是使用 artisan 创建的标准样板规则:

<?php

namespace App\Rules;

use Illuminate\Support\Facades\Storage;
use Illuminate\Contracts\Validation\Rule;

class MyFileValidation implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        // This is where I need the file contents
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The validation error message.';
    }
}

您可以通过全局 request() 帮助程序访问 Reuqest 对象:

$file = request()->file('some_file');

您还可以使用 IoC 注入 Request 对象:

$request = app('Illuminate\Http\Request');
$file = $request->file('some_file');

好吧,这很愚蠢,但也许其他人将来会遇到同样的问题并找到它。

我的问题是我忘记将 enctype="multipart/form-data" 添加到 <form> 元素,所以实际上发送到服务器的只是文件的基本名称。这解释了为什么我在规则中只看到了这些。

添加适当的 enctype 属性后,我得到了一个 Illuminate\Http\UploadedFile 的实例作为规则中的 $value