如何从 byte[]
(Blob) 中获取文件类型扩展名。我正在从数据库中读取文件到 byte[]
,但我不知道如何自动检测文件扩展名。
Blob blob = rs.getBlob(1);
byte[] bdata = blob.getBytes(1, (int) blob.length());
如何从 byte[]
(Blob) 中获取文件类型扩展名。我正在从数据库中读取文件到 byte[]
,但我不知道如何自动检测文件扩展名。
Blob blob = rs.getBlob(1);
byte[] bdata = blob.getBytes(1, (int) blob.length());
您的意思是想获取文件扩展名,而BLOB存储内容?所以如果BLOB存储了jpeg文件的内容,您想要"jpg"?
一般来说这是不可能的。您可以使用一些启发式算法(例如Apache Tika的内容检测)来做一个相当好的猜测。
然而更好的解决方案是将MIME类型(或原始文件扩展名)存储在单独的列中,例如VARCHAR
。
虽然不完美,但是Java Mime Magic库可以推断文件扩展名:
Magic.getMagicMatch(bdata).getExtension();
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);
}
尝试使用ByteArrayDataSource(http://download.oracle.com/javaee/5/api/javax/mail/util/ByteArrayDataSource.html),您会在那里找到getContentType()方法,这应该有所帮助,但我个人从未尝试过。
使用魔数是不使用单独列的替代方案。以下是一些伪代码:
getFileExtn(BLOB)
{
PNGMagNum[] = {0x89, 0x50, 0x4E, 0x47}
if(BLOB[0:3] == PNGMagNum)
return ".png"
//More checks...
}
.html
、.java
和.jpeg
只是三个常见的超过3个字符的文件扩展名。 - Joachim Sauer