【问题标题】:audio validation issues laravel 5.4音频验证问题 laravel 5.4
【发布时间】:2017-11-20 03:32:45
【问题描述】:

我正在尝试验证我的表单请求。我正在做的是上传音频,即 mp3、wav 等,我遇到的问题是它不断向我抛出一条错误消息,说“文件类型必须是 mp3”,我尝试上传一个图像,它说文件类型必须是 mp3,我也尝试上传 mp3,它说同样的事情,下面是我的音频控制器。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Validator;

class UploadController extends Controller
{
public function uploadsingle(Request $request)
{
    $validator = Validator::make($request->all(), [
        'song' => 'required|mimes:image/png',
    ]);

    if($validator->fails()){
        return redirect()->back()->withErrors($validator)->withInput();
    }

    ///save audio, etc
    echo 'validation passed';
}
}

这是我的html代码

<title>Upload page</title>
@include('layouts.page-life')
@include('layouts.navbar')




<h1>Upload Page</h1>
<br>
<form action="{{ route('doupload') }}" method="POST">
{{ csrf_field() }}
@if (count($errors) > 0)
        <div class="alert alert-danger alert-dismissible" role="alert">
            <ul>
            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
        @endif

<input name="song" type="file"/>
<br>
<button class="btn">Submit</button>
</form>

【问题讨论】:

    标签: php laravel laravel-5.3 laravel-5.4 laravel-validation


    【解决方案1】:

    我遇到了同样的问题,但我在这篇文章中找到了答案。

    http://www.thedevlogs.com/laravel-custom-validation-mp3-ogg-extension-files-only/

    Laravel 的 getMimeType() 基于原生的 mime_content_type() 方法,在检测某些 mp3 文件时存在问题。

    最好的办法是使用这样的自定义 MIME 检测器来完成这项工作。

    所以,这就是我所做的对我有用的事情。首先我打开文件: \app\Providers\AppServiceProvider.php

    并且,在启动方法中我添加了以下代码:

    public function boot()
    {
        //Added by B.Singh
        Validator::extend('mp3_ogg_extension', function($attribute, $value, $parameters, $validator) {
    
            if(!empty($value->getClientOriginalExtension()) && ($value->getClientOriginalExtension() == 'mp3' || $value->getClientOriginalExtension() == 'ogg')){
                return true;
            }else{
                return false;
            }
    
        });
    }
    

    所以在你的请求中使用这种方式:

    public function rules()
    {         
        $rules = [ 
           'example' => 'required|mp3_ogg_extension'
        ];
    
        return $rules;
    }    
    
    public function messages()
    {         
        $messages = [ 
           'example.mp3_ogg_extension' => 'REQUIRED WITH VALIDATION, YEAH'
        ];
    
        return $messages;
    }  
    

    不清楚的可以问!

    【讨论】:

      【解决方案2】:

      上面的大部分答案都是正确的。我的情况是我忘记将 enctype="multipart/form-data" 添加到我的表单标签中,如下所示:

      <form action="some url" method="some method" enctype="multipart/form-data"> 
         stuff
      </form>
      

      【讨论】:

        【解决方案3】:

        试试这个:

            $this->validate($request, [
            'file_mp3' => ['required', function ($attribute, $value, $fail) {
                if ($value->getClientOriginalExtension() != 'mp3') {
                    $fail(':attribute must be .mp3!');
                }
        
            }]
        ]);
        

        【讨论】:

          【解决方案4】:

          在 Laravel 5.5 版本中:

          这不是正确的形式,因为它是一种通用验证,但现在它是唯一可以验证仅制作了 mp3 的形式。

          $validator = Validator::make($request->all(), [
              'audio' => 'required|mimetypes:application/octet-stream',
          ]);
          

          【讨论】:

          • 这太愚蠢了。 application/octet-stream 是一种通用的 mime 类型,与音频验证完全无关。
          • 这可能很愚蠢,但它是只允许 mp3 的解决方案。指出解决方案,因为我还没有找到其他解决方案。
          • 因此您无需验证任何内容,只需关闭验证即可。这与 OP 的问题有何关系?
          • 正如我所指出的,通过这种方式,它只允许我加载带有“mp3”扩展名的音频。指示正确的形式和有效的方法,并关闭主题。
          【解决方案5】:

          以下验证将接受 wav、mp3 等。此代码对我有用。

          $validator = Validator::make($request->all(), [
            'song' => 'required|mimes:application/octet-stream,audio/mpeg,mpga,mp3,wav',
          ]);
          

          或者写在单独的请求文件中:例如:app/Http/Requests/SongStoreRequest.php

          public function rules(){
            ['song' => 'required|mimes:application/octet-stream,audio/mpeg,mpga,mp3,wav'];
          }
          

          【讨论】:

          • application/octet-stream 是一种通用的 mime 类型,与音频验证完全无关。
          • @emix 实际上,Laravel 似乎错误地将 ogg 文件识别为八位字节流,所以这可能就是他将其包含在验证器中的原因。 stackoverflow.com/questions/63538962/…
          • 不过,这只是一种解决方法,而不是任何形式的修复。我可以上传带有随机二进制内容的损坏文件,它会通过。
          【解决方案6】:

          我用过

          $validator = Validator::make($request->all(), [
          'song' => 'required|mimes:audio/mpeg',
          ]);
          

          ...它成功了,它正确验证了 mp3 文件,非常感谢您的帮助 :)

          【讨论】:

          • 您没有验证任何内容。根据你的验证方法,this 是一只猫。
          【解决方案7】:

          对 mp3 文件尝试使用“mimes:mpga”。 'mimes:wav' 应该适用于 wav 文件。

           $validator = Validator::make($request->all(), [
              'song' => 'required|mimes:mpga,wav',
          ]);
          

          检查扩展, http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types

          【讨论】:

          • 它会抛出一条验证错误消息,提示“歌曲必须是类型为:mpga 的文件。”
          【解决方案8】:

          更新您的代码以反映 对于mp3 - 使用mpga。

          $validator = Validator::make($request->all(), [
              'song' => 'required|mimes:mpga,wav',
          ]);
          

          【讨论】:

          • 它会抛出一条验证错误消息,提示“歌曲必须是类型为:mpga 的文件。”
          • 它会抛出一条验证错误消息,提示“歌曲必须是类型为:mpga 的文件。”
          • 你能发布文件的“var_dump”吗?
          猜你喜欢
          • 2017-07-12
          • 2017-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-17
          • 2017-10-19
          • 2019-02-07
          • 2020-03-04
          相关资源
          最近更新 更多