在Java中识别文件类型

时间:2011-01-03 09:46:42

标签: java

请帮我查一下上传文件的类型。 我想区分excel类型和csv。

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

6 个答案:

答案 0 :(得分: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);
    }

}

答案 1 :(得分: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"
  }

}

对于excel和csv类型也是如此。未经测试。

答案 2 :(得分:5)

我用java.nio.file.Files

找出了一种更便宜的方法
public String getContentType(File file) throws IOException {
        return Files.probeContentType(file.toPath());
}

- 或 -

public String getContentType(Path filePath) throws IOException {
        return Files.probeContentType(filePath);
}

希望有所帮助。

干杯。

答案 3 :(得分:2)

better way而未使用javax.activation.*

 URLConnection.guessContentTypeFromName(f.getAbsolutePath()));

答案 4 :(得分:2)

如果您已经在使用Spring,则适用于csv和excel:


import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap;

import javax.activation.FileTypeMap;
import java.io.IOException;

public class ContentTypeResolver {

    private FileTypeMap fileTypeMap;

    public ContentTypeResolver() {
        fileTypeMap = new ConfigurableMimeFileTypeMap();
    }

    public String getContentType(String fileName) throws IOException {
        if (fileName == null) {
            return null;
        }
        return fileTypeMap.getContentType(fileName.toLowerCase());
    }

}

或使用javax.activation,您可以更新mime.types文件。

答案 5 :(得分:1)

CSV将以文本开头,而excel类型很可能是二进制文件。

然而,最简单的方法是尝试使用POI加载Excel文档。如果失败,请尝试将文件作为CSV加载,如果失败,则可能无法输入。