【问题标题】:how to validate multiple images in laravel如何在laravel中验证多个图像
【发布时间】:2019-07-14 14:44:23
【问题描述】:

我正在尝试验证图像,因此用户只能输入五张图像(最多),而且他不应该能够上传视频、ai、psd 等。到目前为止,当我尝试上传它显示的视频时没有错误并且它不会上传产品,如果我尝试上传其他文件(如 psd)会显示错误。

Illuminate\Http\Exceptions\PostTooLargeException

如何仅验证要上传的五个图像(最多)以及这些类型的文件mimes:jpeg,jpg,png

代码

控制器

public function store(Request $request)
{
    $this->validate(
        $request,
        [
            'photos' => 'required',
            'photos.*' => '|mimes:jpeg,jpg,png',
        ]);

    foreach ($request->photos as $photo) {
        $filename = $photo->store('public/photos');
        ProductsPhoto::create([
            'product_id' => $product->id,
            'filename' => $filename
        ]);
    }
}

刀片模板

<input multiple="multiple" name="photos[]" type="file">

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    如果我尝试上传 psd 等其他文件,则会显示错误 Illuminate\Http\Exceptions\PostTooLargeException

    当负载高于服务器配置的upload_max_filesize 时抛出PostTooLargeException(当然,您可以自定义)。例如,如果用户尝试上传视频,则总是会抛出此错误。现在,你可以用不同的方式来处理这个问题(不是唯一的):

    • 用于确保最大上传大小的前端验证。
    • 一种在前端处理此响应错误的方法。
    • 指定验证规则以限制上传文件的最大上传大小以避免达到允许的最大值。

    对于后一个选项,您可以使用遵循size 验证规则验证的max 规则。来自文档:

    最大值:值

    正在验证的字段必须小于或等于最大值 价值。字符串、数字、数组和文件以相同的方式计算 时尚作为尺码规则。

    大小:值

    验证中的字段必须具有与给定值匹配的大小。 对于字符串数据,值对应于字符数。为了 数值数据,值对应于给定的整数值。 对于一个 数组,大小对应数组的count对于文件, size 对应于以千字节为单位的文件大小。

    所以在你的情况下,你可以检查上传的文件:

    $this->validate(
        $request, 
        [
        'photos' => 'required',
        'photos.*' => 'mimes:jpeg,jpg,png|max:4000', // e.g., each file should be less than 4MB
       )];
    

    关于下一件事情:

    如何验证只上传五张图片(最多)?

    您可以使用相同的规则,但现在验证数组大小:

    $this->validate(
        $request, 
        [
        'photos' => 'required|array|max:5', // <----
        'photos.*' => 'mimes:jpeg,jpg,png',
       )];
    

    当然,您可以结合这些限制来完成您想要的行为。

    【讨论】:

    • 感谢您的回答。但我想限制 psd、ai 和其他文件类型,我只希望用户只上传 mimes:jpeg,jpg,png 类型的文件,因为即使我更改大小它仍然显示错误,用户也可以上传 psd 和其他文件我不想要。 @HCK
    • @user11710915 已处理。检查我的答案,您可以混合使用多个验证规则。如您所见,我从未删除过mimes:jpeg,jpg,png 规则,我只是添加了一个验证来限制文件大小以及photos 数组中可以包含的文件数量。再次查看我的完整答案,看看如何解决。
    • 我已经检查过了,array|max:5 工作正常,但是这个'photos.*' =&gt; 'mimes:jpeg,jpg,png|max:4000', 不工作,因为我仍然可以上传一个短视频剪辑和其他我不想要的 psd。我只想上传图片而不是视频、psd、ai 等@HCK
    • 试试这个。而不是使用mimes:jpeg,jpg,png 使用这个:mimetypes:image/jpeg,image/png,image/jpg
    【解决方案2】:

    很简单,我之前做过:

    $galleryImageCount = 0; // count the number of existing images if needed
    $galleryImageRules = ['bail|image|mimes:jpeg,png,jpg|max:5120','bail|sometimes|image|mimes:jpeg,png,jpg|max:5120'];
    $imageRule = [];
    
    for ($i = 0; $i < (5 - $galleryImageCount); $i++) {
            $rule = ($i == 0) ? $galleryImageRules[0] : $galleryImageRules[1];
            $key = 'gallery_image.' . $i;
            $imageRule[$key] = $rule;
    }
    
    $this->validate(
        $request,
        $imageRule);
    //Replace 'gallery_image' with 'photos' in your case.
    
    • 干杯!!!

    【讨论】:

    • 你的回答解决了这个问题How can I validate only five images(maximum),但它没有解决另一个问题,因为我仍然可以上传psd,ai文件而我只想上传mimes:jpeg,jpg,png@Ishan Siddiqui
    • 尝试增加 php.ini @user11710915 中 post_max_size && upload_max_filesize 的值
    猜你喜欢
    • 2021-07-17
    • 2021-06-28
    • 2019-10-02
    • 2022-01-22
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2017-11-26
    相关资源
    最近更新 更多