如何从byte[]
(Blob)获取文件类型扩展名。我正在从DB读取文件到byte[]
,但我不知道如何自动检测文件扩展名。如何从字节[](Blob)获取文件类型扩展名
Blob blob = rs.getBlob(1);
byte[] bdata = blob.getBytes(1, (int) blob.length());
如何从byte[]
(Blob)获取文件类型扩展名。我正在从DB读取文件到byte[]
,但我不知道如何自动检测文件扩展名。如何从字节[](Blob)获取文件类型扩展名
Blob blob = rs.getBlob(1);
byte[] bdata = blob.getBytes(1, (int) blob.length());
你的意思是你想获得blob存储内容的文件的扩展名?所以如果BLOB存储JPEG文件的内容,你想要"jpg"
?
这不可能!
如果您将文件存储在blob中,并且需要记住扩展名,那么通常会保留一个单独的列,如扩展名为VARCHAR
。 (我实际上是在我目前正在使用的应用程序中执行此操作,并且我也有一个MIME类型的列。)
尝试使用ByteArrayDataSource(http://download.oracle.com/javaee/5/api/javax /mail/util/ByteArrayDataSource.html),你会在那里找到getContentType()方法,这应该有所帮助,但我从来没有亲自尝试过。
它并不完美,但Java Mime Magic library可能能够推断出文件的扩展名:
Magic.getMagicMatch(bdata).getExtension();
有体面的方法JDK
的URLConnection
类,请参考以下的答案: Getting A File's Mime Type In Java
使用单独列的替代方法是使用Magic Numbers。这里有一些伪代码:
getFileExtn(BLOB)
{
PNGMagNum[] = {0x89, 0x50, 0x4E, 0x47}
if(BLOB[0:3] == PNGMagNum)
return ".png"
//More checks...
}
您必须为您支持的每种文件类型执行此操作。一些模糊的文件类型可能需要通过十六进制编辑器找出来(幻数始终是代码的前几个字节)。使用幻数的好处是你得到的是实际的文件类型,而不是用户决定命名的文件类型。
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);
}
我会使用超过3个字符。 '.html','.java'和'.jpeg'只是3个相当常见的文件扩展名,它们超过3个字符。 –
Jup ..意识到,当我写它...删除了这个常数... – aioobe
Dowenvoter,关心发表评论? – aioobe