1

我在使用 Java 从 MySQL 数据库中读取 blob 时遇到问题。我需要用 jax-rs 编写一个 web 服务来提供保存在数据库中的图像。对于传输,它必须使用 Base64 进行编码。

这是我的代码:

public String getImage(@PathParam("id") int id) throws SQLException{
    System.out.println(id);
    String img64str = "null";
    Blob image = null;
    Connection conn = MySQLConnection.getInstance();
    if(conn != null)
    {
        try{
        // Anfrage-Statement erzeugen.
        Statement query;
        query = conn.createStatement();

        // Ergebnistabelle erzeugen und abholen.

            String sql = "SELECT bild FROM beitraege where id="+id;
            ResultSet result = query.executeQuery(sql);
            //Ergebniss zur�ckliefern
            while (result.next()) {
                System.out.println("while");
                image = result.getBlob("bild");
                InputStream binaryStream = image.getBinaryStream(1, image.length());
                String str= binaryStream.toString();
                byte[] bdata=str.getBytes();
                byte[] img64 = Base64.encode(bdata);
                img64str = new String(img64);
            }

        }catch (SQLException e) {
            e.printStackTrace();
        }
   }

    return img64str;
}

不知何故,它只返回这样的东西(显示的结果列表已解码):

java.io.ByteArrayInputStream@cc90a0a
4

4 回答 4

3

java.io.ByteArrayInputStream@cc90a0a是调用的toString()结果InputStream。它实际上并没有将其转换为 a String- 它只是使用toString()在当前环境中返回对象标识符的默认行为。

接口上定义了几种read()方法InputStream来获取流表示的底层字节序列。您需要使用其中之一来提取内容,而不是尝试将其转换为Stringvia toString()

于 2013-01-30T17:31:05.660 回答
3

问题在于“toString()”调用:binaryStream.toString();BinaryInputStream 不实现toString()。使用类似这样的东西来读取字节:

int ch;

//read bytes from ByteArrayInputStream using read method
while((ch = binaryStream.read()) != -1)
{
   System.out.print((char)ch);
   // store it to an array...
}
于 2013-01-30T17:44:21.970 回答
0

您返回的结果binaryStream.toString()类似于“java.io.ByteArrayInputStream@cc90a0a”。

您必须使用 InputStream 上的读取方法来获取实际内容。

于 2013-01-30T17:30:19.637 回答
-2

这一行是错误的:

binaryStream.toString();

InputStream不覆盖toString(),因此使用Object.toString(),它是这样定义。这解释了为什么你得到那个String

这个另一个问题向您展示了如何正确地从转换InputStreamString.

这表示您不应二进制数据(如 Base64 编码的图像)转换为字符串(请参阅下面的 NullUserException 注释)。

于 2013-01-30T17:31:53.643 回答