Laravel 文件上传:验证磁盘空间

Posted

技术标签:

【中文标题】Laravel 文件上传:验证磁盘空间【英文标题】:Laravel file upload: validation disk space 【发布时间】:2019-12-27 14:22:43 【问题描述】:

我有一个文件上传验证,如果磁盘已满,我希望收到一条错误消息。

我的验证现在看起来像这样:

$validator = Validator::make($request->all(), [
    'file' => [
        'required',
        'file',
        'mimes:' . $mimes,
        'max:' . config('myapp.max-file-size-kb')
    ]
], $messages);

我可以为此使用max,但这会告诉用户文件太大。但这并不是真正的问题。

【问题讨论】:

您是否正在为公司创建类似于 Google 驱动器的东西? 【参考方案1】:

好的,我认为应该可以:

$validator = Validator::make($request->all(), [
    'file' => [
        'required',
        'file',
        'mimes:' . $mimes,
        'max:' . config('myapp.max-file-size-kb'),
        static function ($attribute, $file, $fail) 
            $free_space = disk_free_space( Storage::disk('uploads')->path('/') );
            if ($file->getSize() > $free_space) 
                $fail('Not enough disk space: ' . $free_space . ' bytes left.');
            
        ,
    ]
], $messages);

【讨论】:

我不确定这是否真的有效... php / Apache 可能会在某处缓存上传的数据,因此您可能需要使用双倍空格。如果上传路径在不同的卷上,它可能会起作用。但是你真的想告诉你的用户还剩下多少空间并让他们填满你的音量吗?会对您的用例感兴趣。也许您应该将上传大小限制在可用磁盘空间以下,并由运营团队设置监控以及早检测空间何时用完。或者存储在一些无限的 S3 存储桶中:) 当然,这对于像 S3 这样的存储没有意义。就我而言,它是本地驱动器。上传的文件首先由 apache 存储在同一驱动器上,然后在验证后移动到位(如正常上传)。是的,有监控,但最终监控失败或观看它的人正在睡觉......所以我希望用户知道驱动器已满并且他无能为力。对于用户体验来说,了解问题是什么很重要,否则他会尝试 10 次仍然认为这是他的错 :D

以上是关于Laravel 文件上传:验证磁盘空间的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 教程 - 文件上传

Laravel 5.0 文件上传验证

如何修复“文件上传失败。”使用任何图像上传验证时出错 - Laravel 5.7

Laravel 5 文件上传验证

Laravel - 超过 PHP 最大上传大小限制时验证文件大小

Laravel 上传并验证 apk 文件