Идентификация типа файла в Java

Пожалуйста, помогите мне узнать тип загружаемого файла. Я хотел различать тип excel и csv.

MIMEType возвращает то же самое для обоих этих файлов. Пожалуйста, помогите.

Ответ 1

Я использую 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);
    }

}

Ответ 2

Надеюсь, это поможет. Взято из примера не из моего:

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. Не тестировалось.

Ответ 3

Я выяснил более дешевый способ сделать это с помощью 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);
}

Надеюсь, что это поможет.

Приветствия.

Ответ 4

A лучший способ без использования javax.activation.*:

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

Ответ 5

Если вы уже используете 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.

Ответ 6

CSV начнет с текста, а тип excel, скорее всего, будет двоичным.

Однако самый простой подход - попытаться загрузить документ excel с помощью POI. Если это не удается, попробуйте загрузить файл как CSV, если это не сработает, возможно, ни один из них.