回答編集履歴

2

追記

2017/05/28 16:16

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -28,6 +28,44 @@
28
28
 
29
29
  ---
30
30
 
31
- 追記: ”画像のバイト配列(UTF-8)”という記述から推測するに、バイナリーデータを文字として扱えると思っておられるようですが、もしそうなら間違いです。バイナリーデータはUTF-8とかISO8859などのいわゆる文字のエンコーディングでは表現できません(してはなりません)。
31
+ 追記1: ”画像のバイト配列(UTF-8)”という記述から推測するに、バイナリーデータを文字として扱えると思っておられるようですが、もしそうなら間違いです。バイナリーデータはUTF-8とかISO8859などのいわゆる文字のエンコーディングでは表現できません(してはなりません)。
32
32
 
33
33
 
34
+
35
+ ---
36
+
37
+ 追記2:回答コメントをよく見たら・・・文字列とbyte[]を連結してますね。Javaでは文字列と文字列以外を'+'で連結すると文字列以外のデータはString.valueOfで文字列へ変換されて連結されてしまいます。せっかくバイナリーデータをbyte[]として用意してもStringとして扱ってしまうと"[B@xxxxx"みたいな意味のない文字列へ変換されてしまいます。
38
+
39
+
40
+
41
+ 追記1にも書いたのですが**バイナリーデータを文字列として扱ってはなりません**。明確に区別して処理するようにしてください。
42
+
43
+
44
+
45
+ 自分はSpring frameworkを一度も使ったことがないのでJdbcTemplateを使ってBLOBを書き込むコードを知りません。素のJDBCとPreparedStatementを使うなら次のようにします。
46
+
47
+
48
+
49
+ ```java
50
+
51
+ //カラム定義は id=INT, image=BLOBです
52
+
53
+ int id = ...;
54
+
55
+ byte[] bytes = ...;
56
+
57
+ ...
58
+
59
+ String sql = "insert into image_table(id,image) values (?,?);";
60
+
61
+ PreparedStatement statement = connection.prepareStatement(sql);
62
+
63
+ statement.setInt(1, id); // 1番目のplace holderへintを設定
64
+
65
+ statement.setBytes(2, bytes); // 2番目のplace holderへbyte[](バイナリーデータ)を設定
66
+
67
+ statement.execute();
68
+
69
+ ```
70
+
71
+

1

追記

2017/05/28 16:15

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -23,3 +23,11 @@
23
23
 
24
24
 
25
25
  と書かれていますが、上記のデータは`but.toString()`とした文字列データをISO8859エンコーディングしたバイト列に見えます。つまりDBからバイナリーデータを取り出した後bufへ正しくその内容を設定できていません。DB上にはBLOBとして格納しているかバイナリーをなんらかのエンコードで文字列へ変換したものを格納していると思います。そのデータの取り出し方に問題があるということだと思います。
26
+
27
+
28
+
29
+ ---
30
+
31
+ 追記: ”画像のバイト配列(UTF-8)”という記述から推測するに、バイナリーデータを文字として扱えると思っておられるようですが、もしそうなら間違いです。バイナリーデータはUTF-8とかISO8859などのいわゆる文字のエンコーディングでは表現できません(してはなりません)。
32
+
33
+