質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

783閲覧

servlet&jspでMySQLに画像データを保存するとバイナリデータが文字化けする

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2019/06/14 00:01

前提・実現したいこと

servlet->jspのformタグから画像をupload->DBへ

という処理で、データは格納されているようで、
DBからデータを取得して、表示することは出来るのですが、
terminalで 'select * from 〜' で内容を確認すると、ものすごい量の文字化けしたデータが表示されます。[画像①]

また、このように大量な文字で表示されるのはなぜなのでしょうか?
調べていて、Base64なるものを知ったのですが、この状況だとそれ以前の問題の気がして、
まだ試しておりませんが、何か関係があるのでしょうか。

初心者の質問で申し訳ありませんが、よろしくお願いいたします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

DAO

java

1 2package dao; 3 4import java.io.IOException; 5import java.io.InputStream; 6import java.sql.Connection; 7import java.sql.DriverManager; 8import java.sql.PreparedStatement; 9import java.sql.SQLException; 10 11import javax.servlet.http.Part; 12 13public class InsertPhotoDAO { 14 private final String DRIVER="com.mysql.jdbc.Driver"; 15 private final String JDBC_URL="jdbc:mysql://localhost/Practice_MVC"; 16 private final String DB_USER="root"; 17 private final String DB_PASS=""; 18 19 public void insertPhotos(String title, String name,Part part) throws IOException { 20 21 PreparedStatement ps = null; 22 InputStream stream=part.getInputStream(); 23 24 try{ 25 Class.forName(DRIVER); 26 Connection conn=DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS); 27 String sql ="insert into blob_test(title, file_name, data) values (?, ?, ?)"; 28 29 conn.setAutoCommit(false); 30 ps = conn.prepareStatement(sql); 31 ps.setString(1, title); 32 ps.setString(2, name); 33 ps.setBinaryStream(3, stream); 34 ps.executeUpdate(); 35 36 conn.commit(); 37 conn.close(); 38 39 } catch (ClassNotFoundException e) { 40 e.printStackTrace(); 41 } catch (SQLException e) { 42 e.printStackTrace(); 43 } 44 } 45}

BO(DAOのBO)

java

1package model; 2 3import java.io.IOException; 4 5import javax.servlet.http.Part; 6 7import dao.InsertPhotoDAO; 8 9public class InsertPhotoLogic{ 10 11 public void execute(String title,String name,Part part) throws IOException{ 12 InsertPhotoDAO dao=new InsertPhotoDAO(); 13 dao.insertPhotos(title,name,part); 14 } 15}

BO(fileName 取得)

java

1package model; 2 3import javax.servlet.http.Part; 4 5public class GetFileNameLogic{ 6 public String getFileName(Part part) { 7 String name= null; 8 9 for (String dispotion : part.getHeader("Content-Disposition").split(";")) {//part.getHeader("Content-Disposition")戻り値->String[] 10 if (dispotion.trim().startsWith("filename")) { 11 name = dispotion.substring(dispotion.indexOf("=") + 1).replace("\"", "").trim(); 12 name=name.substring(name.lastIndexOf("\")+1); 13 14 break; 15 } 16 } 17 return name; 18 } 19} 20 21

Servlet

java

1package servlet; 2 3import java.io.IOException; 4 5import javax.servlet.RequestDispatcher; 6import javax.servlet.ServletException; 7import javax.servlet.annotation.MultipartConfig; 8import javax.servlet.annotation.WebServlet; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12import javax.servlet.http.Part; 13 14import model.GetFileNameLogic; 15import model.InsertPhotoLogic; 16/** 17 * Servlet implementation class InsertPhoto 18 */ 19@WebServlet("/InsertPhoto") 20@MultipartConfig(location="/tmp") 21public class InsertPhoto extends HttpServlet { 22 private static final long serialVersionUID = 1L; 23 24 public InsertPhoto() { 25 super(); 26 } 27 28 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 29 30 String path="/WEB-INF/jsp/fileinput.jsp"; 31 32 RequestDispatcher dsp=request.getRequestDispatcher(path); 33 dsp.forward(request, response); 34 35 response.getWriter().append("Served at: ").append(request.getContextPath()); 36 } 37 38 39 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 40 String title=request.getParameter("title"); 41 Part part=request.getPart("data"); 42 43 GetFileNameLogic logic=new GetFileNameLogic(); 44 String name=logic.getFileName(part); 45 46 InsertPhotoLogic ilogic=new InsertPhotoLogic(); 47 ilogic.execute(title,name,part); 48 49 request.setAttribute("title", title); 50 request.setAttribute("name",name); 51 RequestDispatcher dsp=request.getRequestDispatcher("/WEB-INF/jsp/result.jsp"); 52 dsp.forward(request, response); 53 54 doGet(request, response); 55 } 56}

画像①
画像②
画像③

試したこと

文字コードの設定に問題があると思い、sqlのmy.cnfで、文字コードを設定し直したり、
(my.cnf:[画像②]、設定後:[画像③])
servletの文字コード設定を確認したり(Filter chainで全servletに適応させています)

その他、いろいろ試しましたが、直接的な原因がわかっておりません。

よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

mysql: Ver 8.0.16 for osx10.14 on x86_64 (Homebrew)
OS: Mac 10.14.4

Eclipse2019-03(4.11.0)
Tomcat9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ものすごい量の文字化けしたデータが表示されます。

画像データはバイナリデータなので、そのまま表示しようとしても人間には読めない文字の羅列となるだけです。

データベースから出力してちゃんと画像として表示されるなら、それで問題ありません。

投稿2019/06/14 00:08

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/14 00:31

早々にご回答ありがとうございます。 そうでしたか、大変失礼しました! では、base64などは、単にそれを読めるように変換する為のものなのでしょうか。 またそうであれば、可視化以外に変換を行った方が良いという事 (そのままだとDBやトランザクションに影響が出る等) は、あるのでしょうか?
y_waiwai

2019/06/14 05:54 編集

バイナリデータを見るなら、バイナリエディタ、というので見ればいいです。 バイナリデータをテキストとして見ようとするから見れません
退会済みユーザー

退会済みユーザー

2019/06/14 07:13

分かりました。 初心者の質問にお付き合いいただき、どうも有難うございました。 勉強になりました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問