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

問題は "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 に答える
3

java.io.ByteArrayInputStream@cc90a0aを呼び出した結果toString()ですInputStream。実際に に変換するのではなく、現在の環境内でオブジェクトの識別子を返すというStringデフォルトの動作を使用するだけです。toString()

ストリームによって表される基になるバイト シーケンスを取得するためにread()、インターフェイスで定義されたメソッドがいくつかあります。コンテンツを viaInputStreamに変換するのではなく、それらのいずれかを使用してコンテンツを抽出する必要があります。StringtoString()

于 2013-01-30T17:31:05.660 に答える
0

binaryStream.toString()「java.io.ByteArrayInputStream@cc90a0a」のような結果を返しています。

実際のコンテンツを取得するには、InputStream で読み取りメソッドを使用する必要があります。

于 2013-01-30T17:30:19.637 に答える
-2

この行は間違っています:

binaryStream.toString();

InputStreamはオーバーライドしないため、このように定義されたtoString()を使用します。これは、なぜそれを取得しているのかを説明しています。Object.toString()String

この他の質問InputStreamは、 からに正しく変換する方法を示していますString

これは、バイナリ データ (Base64 でエンコードされた画像など) を文字列に変換してはならないことを示しています (以下の NullUserException のコメントを参照してください)。

于 2013-01-30T17:31:53.643 に答える