从字节数组中获取Java图像扩展名

10

我有以下代码可以将字节数组保存为图像。

使用以下代码我可以成功地保存图像。

目前我正在使用“.png”格式保存图像,但我想从字节数组中获取图像扩展名并以该扩展名保存图像。

这是我的代码

public boolean SaveImage(String imageCode) throws Exception {
    boolean status = false;
    Connection dbConn = null;
    CallableStatement callableStatement = null;
    try {
        String base64Image = imageCode.split(",")[1];
        byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image);

        Properties propFile = LoadProp.getProperties();
        String filepath = propFile.getProperty(Constants.filepath);
        File file = new File(filepath + "xyz.png");
        FileOutputStream fos = new FileOutputStream(file);
        try {
            fos.write(imageBytes);
        } finally {
            fos.close();
        }
    } catch (Exception e) {
        throw e;
    } finally {
        if (callableStatement != null) {
            callableStatement.close();
        }
        if (dbConn != null) {
            dbConn.close();
        }
    }
    return status;
}

我正在使用Java和Tomcat 8。


1
可能是一个重复的问题:如何识别一个字节数组的内容是否为JPEG格式? - user5547025
1
进一步说,有一个完整的魔数列表可以指示文件类型:https://en.wikipedia.org/wiki/List_of_file_signatures - Thomas
2个回答

30

有很多解决方案。例如,非常简单的方法:

String contentType = URLConnection.guessContentTypeFromStream(new ByteArrayInputStream(imageBytes));

或者您可以使用第三方库。比如Apache Tika

String contentType = new Tika().detect(imageBytes);

这仅适用于PNG图像,对于JPG图像也会给出PNG扩展名。 - Akhil kumar Amarneni

0
你会使用前缀头data:image/png;base64的base64图像数据吗?
从RFC中,"data" URL的定义:
### Form : `data:[<mediatype>][;base64],<data>`
### Syntax:
`dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
mediatype:= [ type "/" subtype ] *( ";" parameter )
data       := *urlchar
parameter  := attribute "=" value`

示例:

data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw......

然后您可以获取带有gif扩展名的文件。


2
问题中没有提到字节是Base64编码的,也没有使用data: URL。 - user5547025

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