如何从byte[]
(Blob)获取文件类型扩展名。我正在从DB读取文件到byte[]
,但我不知道如何自动检测文件扩展名。
Blob blob = rs.getBlob(1);
byte[] bdata = blob.getBytes(1, (int) blob.length());
答案 0 :(得分:11)
你的意思是你想获得blob存储内容的文件的扩展名?因此,如果BLOB存储jpeg文件的内容,您需要"jpg"
?
一般来说这是不可能的。您可以使用Apache Tikas content detection之类的启发式方法做出相当不错的 guess 。
然而,更好的解决方案是将mime类型(或原始文件扩展名)存储在单独的列中,例如VARCHAR
。
答案 1 :(得分:2)
尝试使用ByteArrayDataSource(http://download.oracle.com/javaee/5/api/javax/mail/util/ByteArrayDataSource.html)你会在那里找到getContentType()方法,这应该有所帮助,但我从来没有亲自尝试过。
答案 2 :(得分:2)
这不完美,但Java Mime Magic library可能能够推断文件扩展名:
Magic.getMagicMatch(bdata).getExtension();
答案 3 :(得分:1)
使用单独列的替代方法是使用Magic Numbers。这是一些伪代码:
getFileExtn(BLOB)
{
PNGMagNum[] = {0x89, 0x50, 0x4E, 0x47}
if(BLOB[0:3] == PNGMagNum)
return ".png"
//More checks...
}
您必须为您支持的每种文件类型执行此操作。您可能必须通过十六进制编辑器找到一些模糊的文件类型(幻数始终是代码的前几个字节)。使用幻数的好处是你获得了实际的文件类型,而不是用户刚刚决定命名的文件类型。
答案 4 :(得分:1)
if(currentImageType ==null){
ByteArrayInputStream is = new ByteArrayInputStream(image);
String mimeType = URLConnection.guessContentTypeFromStream(is);
if(mimeType == null){
AutoDetectParser parser = new AutoDetectParser();
Detector detector = parser.getDetector();
Metadata md = new Metadata();
mimeType = detector.detect(is,md).toString();
if (mimeType.contains("pdf")){
mimeType ="pdf";
}
else if(mimeType.contains("tif")||mimeType.contains("tiff")){
mimeType = "tif";
}
}
if(mimeType.contains("png")){
mimeType ="png";
}
else if( mimeType.contains("jpg")||mimeType.contains("jpeg")){
mimeType = "jpg";
}
else if (mimeType.contains("pdf")){
mimeType ="pdf";
}
else if(mimeType.contains("tif")||mimeType.contains("tiff")){
mimeType = "tif";
}
currentImageType = ImageType.fromValue(mimeType);
}
答案 5 :(得分:0)
JDK
的{{1}}课程中有不错的方法,请参考以下答案:
Getting A File's Mime Type In Java