2011-08-19 3664 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); 
      }