精华内容
下载资源
问答
  • java判断文件类型

    万次阅读 2019-05-28 16:10:59
    判断文件类型 在上传文件,判断文件类型的时候,往往会通过后缀名和头部信息判断,前者大大不靠谱,后者个别类型的文件不太好判断。这里推荐apache的一款tika,可以做文件判断还可以更强大的做内容解析。一下写出两...

    判断文件类型

    在上传文件,判断文件类型的时候,往往会通过后缀名和头部信息判断,前者大大不靠谱,后者个别类型的文件不太好判断。这里推荐apache的一款tika,可以做文件判断还可以更强大的做内容解析。一下写出两种方法判断,一个基于头部信息,一个基于tika.

    一:根据头部信息

    public class CheckFileType {
    
        private static Trace logger = Trace.getTrace(CheckFileType.class);
        // 缓存文件头信息-文件头信息
        public static final HashMap<String, String> mFileTypes = new HashMap<String, String>();
    
        static {
            // images
            mFileTypes.put("FFD8FF", "jpg");
            mFileTypes.put("89504E47", "png");
            mFileTypes.put("47494638", "gif");
            mFileTypes.put("49492A00", "tif");
            mFileTypes.put("424D", "bmp");
            //
            mFileTypes.put("41433130", "dwg"); // CAD
            mFileTypes.put("38425053", "psd");
            mFileTypes.put("7B5C727466", "rtf"); // 日记本
            mFileTypes.put("3C3F786D6C", "xml");
            mFileTypes.put("68746D6C3E", "html");
            mFileTypes.put("44656C69766572792D646174653A", "eml"); // 邮件
            mFileTypes.put("D0CF11E0", "doc");
            mFileTypes.put("D0CF11E0", "xls");//excel2003版本文件
            mFileTypes.put("5374616E64617264204A", "mdb");
            mFileTypes.put("252150532D41646F6265", "ps");
            mFileTypes.put("255044462D312E", "pdf");
            mFileTypes.put("504B0304", "docx");
            mFileTypes.put("504B0304", "xlsx");//excel2007以上版本文件
            mFileTypes.put("52617221", "rar");
            mFileTypes.put("57415645", "wav");
            mFileTypes.put("41564920", "avi");
            mFileTypes.put("2E524D46", "rm");
            mFileTypes.put("000001BA", "mpg");
            mFileTypes.put("000001B3", "mpg");
            mFileTypes.put("6D6F6F76", "mov");
            mFileTypes.put("3026B2758E66CF11", "asf");
            mFileTypes.put("4D546864", "mid");
            mFileTypes.put("1F8B08", "gz");
        }
    
        /**
         * @return 文件头信息
         * @author liang.pan
         * <p>
         * 方法描述:根据输入流获取文件头信息
         */
        public static String getFileType(InputStream inputStream) {
            return mFileTypes.get(getFileHeader(inputStream));
        }
    
        /**
         * @return 文件头信息
         * @author liang.pan
         * <p>
         * 方法描述:根据输入流获取文件头信息
         */
        public static String getFileHeader(InputStream inputStream) {
            InputStream is = null;
            String value = null;
            try {
                is = inputStream;
                byte[] b = new byte[4];
                /*
                 * int read() 从此输入流中读取一个数据字节。int read(byte[] b) 从此输入流中将最多 b.length
                 * 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len)
                 * 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
                 */
                is.read(b, 0, b.length);
                value = bytesToHexString(b);
            } catch (Exception e) {
            } finally {
                if (null != is) {
                    try {
                        is.close();
                    } catch (IOException e) {
                    }
                }
            }
            logger.info(">>>>>文件的头部信息:" + value);
            if (StringUtils.startsWith(value, "FFD8FF")) {
                value = value.substring(0, 6);
            }
            return value;
        }
    
        /**
         * @param src 要读取文件头信息的文件的byte数组
         * @return 文件头信息
         * @author liang.pan
         * <p>
         * 方法描述:将要读取文件头信息的文件的byte数组转换成string类型表示
         */
        private static String bytesToHexString(byte[] src) {
            StringBuilder builder = new StringBuilder();
            if (src == null || src.length <= 0) {
                return null;
            }
            String hv;
            for (int i = 0; i < src.length; i++) {
                // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
                hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
                if (hv.length() < 2) {
                    builder.append(0);
                }
                builder.append(hv);
            }
            return builder.toString();
        }
    
    }

    二:tika

    引入依赖
    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-core</artifactId>
        <version>1.20</version>
    </dependency>
    
    public class TikaToolKit {
    
        /**
         * 获取类型
         * @param file
         * @return
         * @throws IOException
         * @throws TikaException
         * @throws SAXException
         */
        public static String getMimeType(File file) {
            if (file.isDirectory()) {
                return "the target is a directory";
            }
    
            AutoDetectParser parser = new AutoDetectParser();
            parser.setParsers(new HashMap<MediaType, Parser>());
            Metadata metadata = new Metadata();
            metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName());
            try (InputStream stream = new FileInputStream(file)) {
                parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
            }catch (Exception e){
                throw new RuntimeException();
            }
            return metadata.get(HttpHeaders.CONTENT_TYPE);
        }
    
        /**
         * 判断是否是图片
         * @param file
         * @return
         * @throws TikaException
         * @throws IOException
         * @throws SAXException
         */
        public static boolean isImage(File file){
            String type = getMimeType(file);
            System.out.println(type);
            Pattern p = Pattern.compile("image/.*");
            Matcher m = p.matcher(type);
            return m.matches();
        }
    }

    常见文件类型

    MimeType    文件类型
    application/msword    word(.doc)
    application/vnd.ms-powerpoint    powerpoint(.ppt)
    application/vnd.ms-excel    excel(.xls)
    application/vnd.openxmlformats-officedocument.wordprocessingml.document    word(.docx)
    application/vnd.openxmlformats-officedocument.presentationml.presentation    powerpoint(.pptx)
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet    excel(.xlsx)
    application/x-rar-compressed    rar
    application/zip    zip
    application/pdf    pdf
    video/*    视频文件
    image/*    图片文件
    text/plain    纯文本
    text/css    css文件
    text/html    html文件
    text/x-java-source    java源代码
    text/x-csrc    c源代码
    text/x-c++src    c++源代码
     

    展开全文
  • * 将application.properties文件中 kefu开头的值注入属性 * @ConfigurationProperties(prefix = KefuConfig.PREFIX) */ @Component @ConfigurationProperties(prefix = KefuConfig.PREFIX) @Data public class ...
  • 只需要音频,但是有一些用户将视频格式的文件修改后缀名后提交了上来,现在需要去读取文件头判断文件的真实类型,并将视频格式的文件中的音频提取出来 解决方案 首先读取文件文件头判断文件真实类型 private static...

    业务场景

    只需要音频,但是有一些用户将视频格式的文件修改后缀名后提交了上来,现在需要去读取文件头判断文件的真实类型,并将视频格式的文件中的音频提取出来

    解决方案

    首先读取文件文件头判断文件真实类型

        private static HashMap<String,String> fileHeadMap = new HashMap<>();
    
        static {
            //音频
            fileHeadMap.put("494433030000","mp3");
            fileHeadMap.put("664c61430000","flac");//网易云无损音频文件
            //视频
            fileHeadMap.put("52494646d07d","avi");
            fileHeadMap.put("000000206674","mp4");
    
        }
    
    
    
        /**
         * 获取文件类型
         * @param filePath 文件路径
         * @return  文件类型
         * @throws IOException
         */
        public static String getFileHead(String filePath)throws IOException{
            //获取文件头
            File file = new File(filePath);
            FileReader reader = new FileReader(file);
            BufferedReader br = new BufferedReader(reader);
            StringBuffer fileHead = new StringBuffer();
            for(int i = 0 ; i<=5;i++ ){
                int flag = br.read();
                if(Integer.toHexString(flag).length()==1){
                    fileHead = fileHead.append(0);
                }
                fileHead = fileHead.append(Integer.toHexString(flag));
            }
            br.close();
            //查询文件类型
            return fileHeadMap.get(fileHead.toString());
        }
    

    然后将视频格式文件的文件中的音频提取出来
    网上查了基本都是使用的ffmpeg
    先需要下载:官网地址 csdn
    下载解压
    然后编写代码,基本思路就是在java代码中调用ffmpeg的可执行文件去处理视频文件

        /**
         * 利用ffmpeg提取视频中的音频
         * @param vedioUrl 视频文件地址
         * @param ffmpegUrl ffmpeg应用地址
         * @throws InterruptedException
         * @throws IOException
         */
        public static void vedioToPcm(String vedioUrl,String ffmpegUrl) throws InterruptedException, IOException {
            List<String> commend = new ArrayList<String>();
            //ffmpegUrl -i vedioUrl -vn mp3Url -vn
            commend.add(ffmpegUrl);
            commend.add("-i");
            commend.add(vedioUrl);
            commend.add("-vn");
            //处理MP4地址
            StringBuffer mp3Adress = new StringBuffer(vedioUrl.substring(0,vedioUrl.length()-4));
            mp3Adress.append("(copy).mp3");
            commend.add(mp3Adress.toString());
            commend.add("-vn");
            commend.add("-y");
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commend);
            builder.redirectErrorStream(true);
            Process process = builder.start();
            process.waitFor();// 等待进程执行结束
        }
    

    因为ffmpeg不支持直接替换掉原文件所以还需要处理下

    
        /**
         * 修改文件名
         * @param fileName 需要修改的文件全名(带路径)
         * @param newName 需要修改为什么文件名(全名,带路径)
         * @return 是否修改成功
         */
        public static boolean rename(final String fileName, final String newName) {
            File file = new File(fileName);
            //非空判定
            if (file == null) return false;
            if (!file.exists()) return false;
            if ("".equals(newName)) return false;
            //新老名称相同时直接返回
            if (newName.equals(file.getName())) return true;
            File newFile = new File(newName);
            // 文件的新名称存在,然后返回false
            return !newFile.exists() && file.renameTo(newFile);
        }
    
        /**
         * 删除单个文件
         *
         * @param fileName 要删除的文件的文件名
         * @return 单个文件删除成功返回true,否则返回false
         */
        public static boolean deleteFile(String fileName) {
            File file = new File(fileName);
            // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
            if (file.exists() && file.isFile()) {
                if (file.delete()) {
                    System.out.println("删除单个文件" + fileName + "成功!");
                    return true;
                } else {
                    System.out.println("删除单个文件" + fileName + "失败!");
                    return false;
                }
            } else {
                System.out.println("删除单个文件失败:" + fileName + "不存在!");
                return false;
            }
        }
    

    完成

    展开全文
  • 2.根据文件流中是否存在0x00-0x07这八个字符,如果存在说明是二进制文件,需要读取整个文件判断,感觉效率太低 3.通过javax.activation.MimetypesFileTypeMap这个类来实现,它是通过直接与系统交互来实现的,...
    1.根据后缀名,这个就是简单的字符串匹配,由于存在改名情况,基本无用

    2.根据文件流中是否存在0x00-0x07这八个字符,如果存在说明是二进制文件,需要读取整个文件去判断,感觉效率太低

    3.通过javax.activation.MimetypesFileTypeMap这个类来实现,它是通过直接与系统交互来实现的,感觉比上面两个要好

     
    void addMimeTypes(String mime_types) // 将 MIME 类型值预先添加到注册表。
    String getContentType(File f) // 返回该文件对象的 MIME 类型。
    String getContentType(String filename) // 返回基于指定文件名的 MIME 类型。

    // 使用
    File f = new File("文件路径");
    new MimetypesFileTypeMap().getContentType(f);
    // 结果举例:
    // 1.txt -> text/plain
    // 无后缀名的文本文件 -> application/octet-stream;
    // jpg图片格式文件 -> image/jpeg;


    它提供的类型比较少,但是可以通过方法给它添加类型
    new MimetypesFileTypeMap().addMimeTypes("application/pdf pdf");
    展开全文
  • 最早以前,写一个文件下载的程序,判断文件类型是个大问题,不断的根据MimetypesFile添加,现在mustang做了相应的类FileTypeMap。下面是个例子,package test;import javax.activation.*;import java.io.*;public ...

    最早以前,写一个文件下载的程序,判断文件的类型是个大问题,不断的根据MimetypesFile添加,现在mustang做了相应的类FileTypeMap。
    下面是个例子,
    package test;

    import javax.activation.*;
    import java.io.*;

    public class FileTypes {
     public static void main(String args[]) {
      FileTypeMap map = FileTypeMap.getDefaultFileTypeMap();
      String path;
      if (args.length == 0) {
       path = "d:/";
      } else {
       path = args[0];
      }
      File dir = new File(path);
      File files[] = dir.listFiles();
      for (int i = 0; i < files.length; i++) {
       File file = files[i];
       System.out
         .println(file.getName() + ": " + map.getContentType(file));
      }
     }
    }
    可以显示出文件的类型,下载还是打开,遗憾的是java 5提供的for each mustang却不支持了,for (File file: files) 将是个错误。
    java实现用本地程序打开文件,就是实现ShellExecute的功能是个困难的事情,在mustang这个变得simple。

    import java.awt.*;
    import java.io.*;

    public class DesktopTest {
     public static void main(String args[]) {
      if (!Desktop.isDesktopSupported()) {
       System.err.println("Desktop not supported!");
       System.exit(-1);
      }
      Desktop desktop = Desktop.getDesktop();
      String path;
      if (args.length == 0) {
       path = "d:/";
      } else {
       path = args[0];
      }
      File dir = new File(path);
      File files[] = dir.listFiles();
      for (int i = 0; i < files.length; i++) {
       File file = files[i];
       if (desktop.isSupported(Desktop.Action.OPEN)) {
        System.out.println("Opening... " + file.getName());
        try {
         desktop.open(file);
        } catch (IOException ioe) {
         System.err.println("Unable to open: " + file.getName());
        }
       }

      }
     }
    }

     
    展开全文
  • JAVA判断文件的真实类型

    千次阅读 2018-07-03 16:45:20
    在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造...java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下:import java.io.FileInputStream; import java.io.IOException; import ja...
  • java判断文件的真实类型

    万次阅读 2016-07-17 15:58:33
    在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行...java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下: package com.zhuifeng.util.excel; import java.io.FileInputStrea
  • java-文件类型-文件类型判断

    千次阅读 2014-07-17 21:53:27
    摘要:文件类型判断:最直接的方法通过文件的后缀名字可以知道文件是sm
  • java根据文件头判断文件类型

    千次阅读 2019-02-15 12:33:37
    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; publ...
  • java 获取文件头判断文件类型

    千次阅读 2019-07-05 21:10:17
    介绍:1.件头是位于文件开头的一段承担一定任务的数据,一般都在开头的...为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合...
  • 通常情况下,我们取文件的后缀名作为文件类型即可,但有时为了防止用户随便修改后缀名,就需要获取文件的真实类型。这时候可以通过文件的魔数来判别。魔数就是文件开头的那几个字节的数据。 代码实现 工具类代码...
  • java:根据文件头来判断文件类型

    千次阅读 2016-11-23 10:57:16
    根据文件后缀来判断文件类型,往往是不靠谱的,因为要考虑到,可能人为的更改文件后缀,导致一些问题。 因此,下面是详细的根据文件头信息来判断文件类型。 文件头的十六进制以后继续补充。package ...
  • JAVA判断文件编码类型

    千次阅读 2013-09-04 14:18:42
    以下代码就可以判断文件是什么编码方式。  主要jar包:cpdetector.jar  下载地址http://cpdetector.sourceforge.net/  同时还需jchardet-1.0.jar这个包,否则detector.add(cpdetector.io.JC
  • java根据文件名称判断文件类型

    万次阅读 2017-03-31 15:31:38
    /* author:zss  * 日期:2017年3月31日  * 功能:根据文件名称判断... * 备注:文件类型不完善,有需要的自行添加  */ public class FileType { public String fileType(String fileName) { if (fileName ==
  • java 简易文件类型判断根据文件后缀

    千次阅读 2019-01-11 17:01:55
    如需使用更高安全性的,请使用判断文件头的方式。 参考地址:文件头判断 https://www.cnblogs.com/ios9/p/7476355.html 1:图片 2:文档 可进行细分 3:视频 4:音频 工具类,可自行修改值。 涵盖常用文件类型。 ...
  • java读取文件时,判断文件类型与后缀是否一致,若是人文手动修改文件后缀,将excel改成doc,那这时候校验出来的结果应该是文件格式与后缀不一致这个结果。(不使用只判断后缀名的方式)
  • java根据文件流判断文件类型

    千次阅读 2018-05-21 14:50:47
    原文https://www.cnblogs.com/chenglc/p/7117847.htmlimport java.io.FileInputStream; public class FileType{ public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = ne...
  • java根据文件流判断文件类型(后缀名) import java.io.FileInputStream; public class FileType{ public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder ...
  • 目前需要进行对docx和zip格式文件进行判断判断后缀名肯定不行(后缀名可以恶意更改),头文件解析的话docx和zip的头文件时相同的,还有什么方式能准确区分这两种类型文件的?
  • Java判断文件是否为图片

    万次阅读 2017-04-21 11:23:45
    Java检查文件类型有几种方法: 1.判断文件后缀名 String extension = &amp;amp;quot;&amp;amp;quot;; int i = fileName.lastIndexOf('.'); if (i &amp;amp;amp;gt; 0) { extension = fileName....
  • 1.两点需要注意 1.string.spilt("\\.")分割字符串成子字符串数组,以“.”分割,必须写成string.spilt("\\.")的方式,不能写成string.spilt(".")。斜线必须是反斜线且。...
  • java判断上传文件类型(笔记)

    万次阅读 2018-03-07 15:43:22
    之前做过一个功能,说是上传文件到服务器,但是所有文件excel、word、音乐、视频等都上传到一个文件夹,不利于查找,于是自己上网查询关于这...//文件类型枚取  public enum FileType { /** * JEPG. */ ...
  • java文件类型判断的工具类

    千次阅读 2019-03-01 13:26:24
    文件类型判断的工具类 package com.zmt.taobaoke.utils; import java.io.File; import org.apache.commons.fileupload.disk.DiskFileItem; import org.springframework.stereotype.Component; import org.spring...
  • 目前需要进行对docx和zip格式文件进行判断判断后缀名肯定不行(后缀名可以恶意更改),头文件解析的话docx和zip的头文件时相同的,还有什么方式能准确区分这两种类型文件的?
  • java判断文件是否为图片

    千次阅读 2018-11-15 08:17:53
    java判断文件是否为图片

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 407,015
精华内容 162,806
关键字:

java判断文件类型

java 订阅