在Java中识别文件类型

Anu*_*dha 12 java

请帮我查看正在上传的文件类型.我想区分excel类型和csv.

MIMEType为这两个文件返回相同的内容.请帮忙.

小智 16

我使用Apache Tika,它使用魔术字节模式和globbing提示(文件扩展名)来识别文件类型,以检测MIME类型.它还支持额外的文件内容解析(我实际上没有使用).

下面是一个快速而肮脏的示例,说明如何使用Tika检测文件类型而不对文件执行任何其他解析:

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;

import org.apache.tika.metadata.HttpHeaders;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaMetadataKeys;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.xml.sax.helpers.DefaultHandler;

public class Detector {

    public static void main(String[] args) throws Exception {
        File file = new File("/pats/to/file.xls");

        AutoDetectParser parser = new AutoDetectParser();
        parser.setParsers(new HashMap<MediaType, Parser>());

        Metadata metadata = new Metadata();
        metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName());

        InputStream stream = new FileInputStream(file);
        parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
        stream.close();

        String mimeType = metadata.get(HttpHeaders.CONTENT_TYPE);
        System.out.println(mimeType);
    }

}
Run Code Online (Sandbox Code Playgroud)


Nei*_*val 9

我希望这将有所帮助.摘自一个不是我的例子:

import javax.activation.MimetypesFileTypeMap;
import java.io.File;

class GetMimeType {
  public static void main(String args[]) {
    File f = new File("test.gif");
    System.out.println("Mime Type of " + f.getName() + " is " +
                         new MimetypesFileTypeMap().getContentType(f));
    // expected output :
    // "Mime Type of test.gif is image/gif"
  }
Run Code Online (Sandbox Code Playgroud)

}

对于excel和csv类型也是如此.没有测试过.

  • 从反编译的代码来看,它似乎只使用了文件名的后缀(扩展名)。这还不够好。 (2认同)

tmw*_*nik 5

我想出了一个更便宜的方式 java.nio.file.Files

public String getContentType(File file) throws IOException {
        return Files.probeContentType(file.toPath());
}
Run Code Online (Sandbox Code Playgroud)

- 要么 -

public String getContentType(Path filePath) throws IOException {
        return Files.probeContentType(filePath);
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

干杯.

  • 要小心,因为它依赖于操作系统!我的mac甚至无法检测到css文件的MIME类型. (2认同)