2011-08-19 101 views

回答

9

你的意思是你想獲得blob存儲內容的文件的擴展名?所以如果BLOB存儲JPEG文件的內容,你想要"jpg"

這不可能!

如果您將文件存儲在blob中,並且需要記住擴展名,那麼通常會保留一個單獨的列,如擴展名爲VARCHAR。 (我實際上是在我目前正在使用的應用程序中執行此操作,並且我也有一個MIME類型的列。)

+1

我會使用超過3個字符。 '.html','.java'和'.jpeg'只是3個相當常見的文件擴展名,它們超過3個字符。 –

+0

Jup ..意識到,當我寫它...刪除了這個常數... – aioobe

+0

Dowenvoter,關心發表評論? – aioobe

1

嘗試使用ByteArrayDataSource(http://download.oracle.com/javaee/5/api/javax /mail/util/ByteArrayDataSource.html),你會在那裏找到getContentType()方法,這應該有所幫助,但我從來沒有親自嘗試過。

2

它並不完美,但Java Mime Magic library可能能夠推斷出文件的擴展名:

Magic.getMagicMatch(bdata).getExtension(); 
1

使用單獨列的替代方法是使用Magic Numbers。這裏有一些僞代碼:

getFileExtn(BLOB) 
{ 
    PNGMagNum[] = {0x89, 0x50, 0x4E, 0x47} 
    if(BLOB[0:3] == PNGMagNum) 
     return ".png" 
    //More checks... 
} 

您必須爲您支持的每種文件類型執行此操作。一些模糊的文件類型可能需要通過十六進制編輯器找出來(幻數始終是代碼的前幾個字節)。使用幻數的好處是你得到的是實際的文件類型,而不是用戶決定命名的文件類型。

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); 
      } 
相關問題