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

12

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

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

13

您的意思是想获取文件扩展名,而BLOB存储内容?所以如果BLOB存储了jpeg文件的内容,您想要"jpg"?

一般来说这是不可能的。您可以使用一些启发式算法(例如Apache Tika的内容检测)来做一个相当好的猜测。

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


1
我会使用超过3个字符的文件扩展名。.html.java.jpeg只是三个常见的超过3个字符的文件扩展名。 - Joachim Sauer

4

虽然不完美,但是Java Mime Magic库可以推断文件扩展名:

Magic.getMagicMatch(bdata).getExtension();

你好Adam!我在Spring应用程序中尝试了这个,但系统警告我没有MagicParseException类(它是其中一个要求我处理的异常)。该怎么办?谢谢! - tom

2
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);
            }

AutoDetectParser 来自于 Apache Tika - slindenau

2

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


1

使用魔数是不使用单独列的替代方案。以下是一些伪代码:

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

您需要为支持的每种文件类型都执行此操作。对于一些不常见的文件类型,您可能需要通过十六进制编辑器自行查找(魔数始终是代码的前几个字节)。使用魔数的好处是您可以获得实际的文件类型,而不是用户刚刚决定命名的文件类型。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接