2011-01-03 17 views
11

Ayúdeme a averiguar el tipo de archivo que se está cargando. Quería distinguir entre excel type y csv.Identificación de tipo de archivo en Java

MIMEType devuelve lo mismo para ambos archivos. Por favor ayuda.

+2

Quizás duplicado de http://stackoverflow.com/questions/2729038/is-there-a-java-library-equivalent-to-file-command-in-unix. Al menos puede encontrar su respuesta allí –

Respuesta

9

Espero que esto ayude. Tomado de un ejemplo no de la mía:

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

}

mismo puede ser cierto para Excel y CSV tipos. No probado.

+0

A partir del código descompilado, parece usar solo el sufijo (extensión) del nombre de archivo. Que no es lo suficientemente bueno – virgo47

1

El archivo CSV comenzará con texto y el tipo de Excel probablemente sea binario.

Sin embargo, el enfoque más simple es tratar de cargar el documento de Excel utilizando POI. Si esto falla intente cargar el archivo como un CSV, si eso falla posiblemente no tenga ninguno.

2

Un better way sin utilizar javax.activation.*:

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

utilizo Apache Tika que identifica el tipo de archivo usando patrones de bytes mágicas y consejos englobamiento (la extensión) para detectar el tipo MIME. También es compatible con el análisis adicional de los contenidos del archivo (que realmente no uso).

Aquí está un ejemplo rápido y sucio sobre cómo Tika se puede utilizar para detectar el tipo de archivo sin realizar ningún análisis adicional en el archivo:

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

Si ya está utilizando la primavera esto funciona para csv y sobresalir :

 

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()); 
    } 

} 
 

o con javax.activation puede actualizar el archivo mime.types.

4

me di cuenta de una manera más barata de hacer esto con java.nio.file.Files

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

- o -

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

Espero que ayude.

Saludos.

+2

¡Tenga cuidado, porque depende del sistema operativo! Mi Mac no fue capaz de detectar el tipo MIME de un archivo css. –

Cuestiones relacionadas