【问题标题】:How to validate the file name in Laravel 5.4如何在 Laravel 5.4 中验证文件名
【发布时间】:2020-03-06 00:13:24
【问题描述】:

我有一个包含三个输入字段的表单。我想在处理它们之前验证输入值。我想在处理之前验证文件名。我使用正则表达式和 alpha_dash。但是我得到一个有效文件名的错误。我希望我的文件名只包含小写字母、数字、下划线和破折号。如何检查我的文件的文件名验证?

HTML

 <form action="create" method="POST"  enctype="multipart/form-data">
          {{csrf_field()}}
      <table cellpadding="2" width="20%"  align="center"
         cellspacing="2">

         <tr>
           <td colspan=2>
           <center><font size=4><b>Add the iteams  please</b></font></center>
           </td>
         </tr>

         <tr>
           <td>Heading</td>
           <td><input type="text" name="heading" id="heading" size="30">
           {!! $errors->first('heading', '<p class="red">:message</p>') !!}
           </td>
         </tr>

         <tr>
           <td>Image</td>
           <td><input type="file" name="image" id="image" size="40">
           {!! $errors->first('image', '<p class="red">:message</p>') !!}
           </td>
         </tr>

         <tr>
           <td></td>
           <td colspan="2"><input type="submit" name="submit" value="Add Item" /></td>
         </tr>
     </table>
 </form>

控制器部分

  1. 使用正则表达式格式:

- 我收到错误消息,“图像格式无效”。

 public function store(){
    $this->validate(request(),[
          'heading'=>'required',
          'contentbody'=>'required',
           ‘image'=>['required','image','mimes:jpeg,png,jpg,gif,svg','max:2048','regex:/^[a-z0-9-_]+$/' ]

        ]);

}
  1. 使用 Alpa_dash:

- 我收到错误消息,“图像只能包含字母、数字和破折号”。

public function store(){
 $this->validate(request(),[
           'heading'=>'required',
          'contentbody'=>'required',
          'image'=>'required|image|mimes:jpg,png,jpeg,gif,svg|max:2048|alpha_dash'
}

请帮忙, 谢谢!

【问题讨论】:

    标签: php regex laravel laravel-5 laravel-5.4


    【解决方案1】:
    1. 创建自定义验证规则类,例如Filename,并将其放在路径app/Rules/Filename.php
    <?php
    namespace App\Rules;
    
    use Illuminate\Contracts\Validation\Rule;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    
    class Filename implements Rule
    {
        protected $regex;
    
        public function __construct(string $regex)
        {
            $this->regex = $regex;
        }
    
        public function passes($attribute, $value)
        {
            if (!($value instanceof UploadedFile) || !$value->isValid()) {
                return false;
            }
    
            return preg_match($this->regex, $value->getClientOriginalName()) > 0;
        }
    
        public function message()
        {
            return 'The :attribute name is invalid.';
        }
    }
    
    1. 在您的请求规则中添加此自定义规则,如下所示:
    use App\Rules\Filename;
    
    public function store() {
        $this->validate(request(), [
            'heading' => 'required',
            'contentbody' => 'required',
            'image' => [
                'required',
                'image',
                'mimes:jpeg,png,jpg,gif,svg',
                'max:2048',
                new Filename('/^[a-z0-9-_]+$/'), // This is your custom rule
            ],
        ]);
    }
    

    【讨论】:

      【解决方案2】:

      我认为您需要使用自定义正则表达式

      ^[a-z0-9_.-]*$
      

      并在您的验证中像这样使用

      public function store(){
          $this->validate(request(),[
                'heading'=>'required',
                'contentbody'=>'required',
                 ‘image'=>'required|image|mimes:jpg,png,jpeg,gif,svg|max:2048|regex:/^[a-z0-9_.-]*$/'
      
              ]);
      

      编辑 2:

      我不确定,但根据文档,laravel 仅支持上述格式。但是,当我对图像使用验证时,我发现 jpg 没有问题,但仍然可以解决这个问题..

      docs

      编辑 3

      自定义验证见here

      【讨论】:

      • 谢谢金字塔先生。但我仍然得到同样的错误,“图像格式无效”。
      • 好的@金字塔先生
      • 根据文档再次检查答案,您可能会因为 jpg 而遇到此问题
      • 谢谢。但我得到了同样的错误。是否可以对其进行自定义验证?我不知道如何在 Laravel 中进行客户验证。
      • 是的,您可以查看我在答案中提供的参考资料
      【解决方案3】:

      如果其他人和我有同样的问题。我通过将文件名更改为当前时间戳而不是使用原始文件名来解决我的问题。这样,我就不必担心要保存在数据库中的原始文件名的验证。

       public function store(Request $request)
          {
              $this->validate($request,[
                'heading'=>'required',
                'contentbody'=>'required',
                'image'=>['required','image','mimes:jpg,png,jpeg,gif,svg','max:2048']
      
              ]);
      
               if($request->hasFile('image')){
      
                  $inputimagename= time().'.'.$request->file('image')->getClientOriginalExtension();
                  $request->image->storeAs('public/upload', $inputimagename);
      
                Post::create([
                   'heading'=>request('heading'),
                   'content'=>request('contentbody'),
                     'image'=>$inputimagename,
      
                  ]);
      
      
               }
      
             return redirect('/home');
          }
      

      【讨论】:

        猜你喜欢
        • 2018-05-30
        • 1970-01-01
        • 2017-09-09
        • 2019-05-08
        • 2018-01-29
        • 2017-12-17
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多