如何從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