Identifying file type in Java

前端 未结 6 1067
盖世英雄少女心
盖世英雄少女心 2020-12-08 23:24

Please help me to find out the type of the file which is being uploaded. I wanted to distinguish between excel type and csv.

MIMEType returns same for both of thes

相关标签:
6条回答
  • 2020-12-08 23:35

    If you are already using Spring this works for csv and 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());
        }
    
    }
    
    

    or with javax.activation you can update the mime.types file.

    0 讨论(0)
  • 2020-12-08 23:39

    A better way without using javax.activation.*:

     URLConnection.guessContentTypeFromName(f.getAbsolutePath()));
    
    0 讨论(0)
  • 2020-12-08 23:47

    I use Apache Tika which identifies the filetype using magic byte patterns and globbing hints (the file extension) to detect the MIME type. It also supports additional parsing of file contents (which I don't really use).

    Here is a quick and dirty example on how Tika can be used to detect the file type without performing any additional parsing on the file:

    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);
        }
    
    }
    
    0 讨论(0)
  • 2020-12-08 23:55

    The CSV will start with text and the excel type is most likely binary.

    However the simplest approach is to try to load the excel document using POI. If this fails try to load the file as a CSV, if that fails its possibly neither type.

    0 讨论(0)
  • 2020-12-08 23:58

    I figured out a cheaper way of doing this with java.nio.file.Files

    public String getContentType(File file) throws IOException {
            return Files.probeContentType(file.toPath());
    }
    

    - or -

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

    Hope that helps.

    Cheers.

    0 讨论(0)
  • 2020-12-09 00:01

    I hope this will help. Taken from an example not from mine:

    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"
      }
    

    }

    Same may be true for excel and csv types. Not tested.

    0 讨论(0)
提交回复
热议问题