【问题标题】:How to check a file is video type or not in php?如何在php中检查文件是否为视频类型?
【发布时间】:2013-08-20 21:29:12
【问题描述】:

我有以下脚本:

function listFolderFiles($dir){
    $ffs = scandir($dir);
    echo '<ol>';
    foreach($ffs as $ff){
        if($ff != '.' && $ff != '..'){
            echo '<li>'.$ff;
            if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff);
            echo '</li>';
        }
    }
    echo '</ol>';
}
listFolderFiles('upload');

我的问题是我想检测一个文件是视频(mp4 或 mov)类型,我如何检测 $ff 是否是视频类型?

【问题讨论】:

  • 如果你在 *nix 上,你可以使用file 命令。

标签: php file video mime-types


【解决方案1】:
    // Type contains video/mp4,video/avi,video/mpeg,video/mpg etc
    if(preg_match('/video\/*/',$_FILES['add_image_image']['type'])): 
        echo "THIS IS A VIDEO FILE";
    else:
          echo "NOT A VIDEO FILE";           
    endif;

【讨论】:

    【解决方案2】:
    if(end(explode(".",$ff)) =="mp4")
    {
    echo "its an mp4 movie";
    }
    

    你去吧,对于不区分大小写的扩展版本

    <?php
    $ff="abc.MP4";
    if(strtolower(end(explode(".",$ff))) =="mp4")
    {
    echo "its an mp4 movie";
    }
    ?>
    

    【讨论】:

    • 如果我上传了mymovie.MP4 呢?
    • 你可以简单地添加一个 strtolower 检查
    • 如果我上传了mymovie.mpeg4 呢?
    • 我希望你明白我的意思。检查扩展名并不是检测文件格式的万无一失的方法。我仍然可以将文本文件上传为movie.mp4。请改用file 之类的工具。
    • 是的,有道理,我同意
    【解决方案3】:

    使用mime_content_typemime_content_type php.net

    if (mime_content_type($dir.'/'.$ff)=='video/mp4')
        echo "its mp4";
    

    【讨论】:

      【解决方案4】:

      我使用这个代码:

      $mimeType = mime_content_type(public_path('uploads/' . $file));
      $fileType = explode('/', $mimeType)[0]; // video|image
      
      if ($fileType === 'video') {
          // do something
      }
      

      【讨论】:

        【解决方案5】:

        请使用file 之类的工具。此答案具有安全意识,并且是对上传文件类型的一般响应。使用file 的第二个好处是它会告诉您有关所使用格式的更多详细信息。有很多格式组合可以合法地存储在“*.mpg”文件中。您可能无法处理所有这些。

        我做了一个更详细的网络搜索,有一个重复的文本文章列表,但没有发布可靠的解决方案。有一个fileinfo 形式的“魔术字节”检测器。这被编译成最新版本的 PHP(它的标准扩展)。

        注意:mime_content_type() 已弃用。同样,如果需要,请尝试fileinfo

        【讨论】:

        【解决方案6】:

        您可以通过preg_match 实现

        if(preg_match('/^.*\.(mp4|mov)$/i', $filename)) {
            echo $filename;
        }
        

        您可以附加另一个视频分机,例如:(mp4|mov|mpg|mpeg|wmv|mkv)

        【讨论】:

          【解决方案7】:

          你也可以试试这个。应该相当准确和高效

          <?php 
           function isVideo($file) {
             return is_file($file) && (0 === strpos(mime_content_type($file), 'video/'));
           }
          ?>
          

          【讨论】:

            【解决方案8】:

            我最近使用它来获取文件类型,即图像或视频:

            explode('/', $request->article_thumbnail->getMimeType())[0]
            

            【讨论】:

              【解决方案9】:

              获取上传文件的mime类型,如下图检查类型,

              $mime = $file->getMimeType;
              $videoJS = array('video/mp4','video/ogg','video/webm');
              
              if(array_search($mime, $videoJS) !== false) {
                  //do upload
              }
              

              【讨论】:

              • 如果您想要任何类型的代码质量,请不要依赖客户端提交的 MIME 类型。请改用file
              【解决方案10】:
              $fileType = exec( 'file --mime-type '.escapeshellarg($filePath)); //e.g. output -> /tmp/somefile.mov: video/quicktime
              $fileType = substr($fileType, strpos($fileType, ": ") + 2); //strip away file path -> video/quicktime
              $fileType = substr($fileType, 0,strpos($fileType, "/")); //strip away whatever video type -> video
              if ($fileType == 'video') $fileType = 'im a video!';
              

              此代码使用带有选项 --mime-type 的 unix 'file' 命令来最小化输出以便于解析。不确定是否有更好的方法来解析输出。

              还要确保您对正在检查的文件具有读取权限。

              【讨论】:

                猜你喜欢
                • 2011-03-05
                • 1970-01-01
                • 1970-01-01
                • 2011-02-11
                • 1970-01-01
                • 2011-03-11
                • 1970-01-01
                • 1970-01-01
                • 2010-11-25
                相关资源
                最近更新 更多