请帮我查一下上传文件的类型。 我想区分excel类型和csv。
MIMEType为这两个文件返回相同的内容。请帮忙。
答案 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加载,如果失败,则可能无法输入。