如何从byte [](Blob)获取文件类型扩展名

时间:2011-08-19 10:43:43

标签: java

如何从byte[](Blob)获取文件类型扩展名。我正在从DB读取文件到byte[],但我不知道如何自动检测文件扩展名。

Blob blob = rs.getBlob(1);
byte[] bdata = blob.getBytes(1, (int) blob.length());

6 个答案:

答案 0 :(得分:11)

你的意思是你想获得blob存储内容的文件的扩展名?因此,如果BLOB存储jpeg文件的内容,您需要"jpg"

一般来说这是不可能的。您可以使用Apache Tikas content detection之类的启发式方法做出相当不错的 guess

然而,更好的解决方案是将mime类型(或原始文件扩展名)存储在单独的列中,例如VARCHAR

答案 1 :(得分:2)

尝试使用ByteArrayDataSource(http://download.oracle.com/javaee/5/api/javax/mail/util/ByteArrayDataSource.html)你会在那里找到getContentType()方法,这应该有所帮助,但我从来没有亲自尝试过。

答案 2 :(得分:2)

这不完美,但Java Mime Magic library可能能够推断文件扩展名:

Magic.getMagicMatch(bdata).getExtension();

答案 3 :(得分:1)

使用单独列的替代方法是使用Magic Numbers。这是一些伪代码:

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

您必须为您支持的每种文件类型执行此操作。您可能必须通过十六进制编辑器找到一些模糊的文件类型(幻数始终是代码的前几个字节)。使用幻数的好处是你获得了实际的文件类型,而不是用户刚刚决定命名的文件类型。

答案 4 :(得分: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);
            }

答案 5 :(得分:0)

JDK的{​​{1}}课程中有不错的方法,请参考以下答案: Getting A File's Mime Type In Java