用Java从MySQL读取blob

用Java从MySQL读取blob,java,mysql,blob,Java,Mysql,Blob,我在用Java从MySQL数据库读取blob时遇到问题。 我需要用jax-rs编写一个webservice来提供保存在数据库中的图像。对于传输,必须使用Base64对其进行编码 这是我的代码: public String getImage(@PathParam("id") int id) throws SQLException{ System.out.println(id); String img64str = "null"; Blob image = null;

我在用Java从MySQL数据库读取blob时遇到问题。 我需要用jax-rs编写一个webservice来提供保存在数据库中的图像。对于传输,必须使用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

您将返回binaryStream.toString的结果,类似于java.io。ByteArrayInputStream@cc90a0a.


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

您将返回binaryStream.toString的结果,类似于java.io。ByteArrayInputStream@cc90a0a.

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

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

InputStream接口上定义了几种读取方法,用于获取流所表示的基本字节序列。您需要使用其中一个来提取内容,而不是试图通过toString将其转换为字符串。

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

InputStream接口上定义了几种读取方法,用于获取流所表示的基本字节序列。您需要使用其中一个来提取内容,而不是试图通过toString将其转换为字符串。

这一行是错误的:

binaryStream.toString();
InputStream不重写toString,因此使用Object.toString,其定义如下。这就解释了为什么你会得到这个字符串

演示如何将InputStream正确转换为字符串

这意味着您不应该将二进制数据(如Base64编码图像)转换为字符串。请参见下面的NullUserException注释。

这行是错误的:

binaryStream.toString();
InputStream不重写toString,因此使用Object.toString,其定义如下。这就解释了为什么你会得到这个字符串

演示如何将InputStream正确转换为字符串


这意味着您不应该将二进制数据(如Base64编码图像)转换为字符串。请参见下面的NullUserException注释。

问题在于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...
}

问题在于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...
}

这是调用binaryStream.toString的结果。提示:在处理二进制数据时,避免完全使用字符串。这是调用binaryStream.toString的结果。提示:在处理二进制数据时,避免完全使用字符串。-1用于建议将InputStream转换为字符串。如果InputStream实际上不包含文本数据,这是一个糟糕的想法。@NullUserException胡说八道。我不推荐,这是OP想要/要求的。字符串getImage。嗯,它是错误的。这将损坏二进制数据。您应该教育OP以正确的方式进行操作,而不是误导他们进入错误的路径。-1建议将InputStream转换为字符串。如果InputStream实际上不包含文本数据,这是一个糟糕的想法。@NullUserException胡说八道。我不推荐,这是OP想要/要求的。字符串getImage。嗯,它是错误的。这将损坏二进制数据。你应该教育OP以正确的方式做事,而不是误导他们走上错误的道路。@FredM你能给出完整的答案吗here@FredM你能把完整的答案贴在这里吗