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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

2606閲覧

サーバー上の画像ファイルをブラウザに表示したい

moshi

総合スコア90

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/08/25 06:46

編集2020/08/25 07:06

前提・実現したいこと

Springboot + ThymeleafでWebページを作成しています。
サーバー上に置いてある画像ファイル(.jpg)をブラウザ上で表示したいです。

試したこと

PDFプレビューを実装してみたを参考にまず下記のコードを作成しました。

@GetMapping("/viewTest") public String viewTest( @RequestParam("name") String name, HttpServletResponse response){ //ダウンロード対象のファイルデータを取得 String path = "/opt/test/"+ name + ".pdf"; File data = new File(path); if(!data.exists()) { log.error("対象のファイルが存在しません:" + name); return null; } //PDFの場合 if(path.endsWith(".pdf")){ //PDFプレビューの設定を実施 response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "inline;"); } //その他の設定を実施 response.setHeader("Cache-Control", "private"); response.setHeader("Pragma", ""); BufferedInputStream in = null; BufferedOutputStream out = null; try{ in = new BufferedInputStream(new FileInputStream(data)); out = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[1024]; int len = 0; while ((len = in.read(buff, 0, buff.length)) != -1) { out.write(buff, 0, len); } out.flush(); }catch(Exception e){ log.error(e.getMessage()); } //画面遷移先はnullを指定 return null; }

また、Thymeleafで表示したファイル名をクリックした際に下記のJavascriptで上記のコントローラーを呼び出しています。

//ファイル表示 function viewFile(title){ var str = '/testserver/viewTest?name=' + title; window.open(str, "_blank"); }

これでPDFファイルをブラウザ上(新規タブ)に表示することができました。

次に、自分がやろうとしている画像ファイルを表示ということをするにあたって上記のコードを少し変え以下のようにしました

@GetMapping("/viewTest") public String viewTest( @RequestParam("name") String name, HttpServletResponse response){ //ダウンロード対象のファイルデータを取得 String path = "/opt/test/"+ name + ".jpg"; File data = new File(path); if(!data.exists()) { log.error("対象のファイルが存在しません:" + name); return null; } //jpgの場合 if(path.endsWith(".jpg")){ //jpgプレビューの設定を実施 response.setContentType("image/jpeg"); response.setHeader("Content-Disposition", "inline;"); } //その他の設定を実施 response.setHeader("Cache-Control", "private"); response.setHeader("Pragma", ""); BufferedInputStream in = null; BufferedOutputStream out = null; try{ in = new BufferedInputStream(new FileInputStream(data)); out = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[1024]; int len = 0; while ((len = in.read(buff, 0, buff.length)) != -1) { out.write(buff, 0, len); } out.flush(); }catch(Exception e){ log.error(e.getMessage()); } //画面遷移先はnullを指定 return null; }

やることは同じで扱い方が違うだけかと思い上記のようにしてみたのですが、こちらでは新規タブが表示されコントローラーを呼び出しているようには見えるのですがブラウザ上に画像ファイルが表示されませんでした。
ログファイルも確認してみましたが特にエラーなどは発生していませんでした。
どうすればブラウザ上で画像ファイルを参照できるようになるでしょうか?

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

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

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

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

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

m.ts10806

2020/08/25 06:49

エラーもなにも出てないのでしょうか。何が起きたのか具体的に記載してください
moshi

2020/08/25 07:10 編集

>m.ts10806さん ご指摘ありがとうございます。 すみません。書き方が悪くどういった状態になっているのかがわかりにくかったと思います。 修正を行いました。 ちなみに別のタブを開いてそこにPDFを表示、というのが上のコードで 同じことがJPGでもできるのではないかと思いやってみたのですが、別タブは開かれコントローラーのほうも通っているように見えるのですが、画像ファイルは表示されませんでした。 またエラーなどはなにも出ていませんでした。
m.ts10806

2020/08/25 07:26

「見える」ではなく、確実に通っているかデバッグしてください。 その結果を追記してもらえればと。 なにもエラーが起きないのはおかしいですね。 ファイルのパスが違うならFileNotFoundとか、IOなどのExceptionは捕捉されると思うのですが
moshi

2020/08/25 13:15

>m.ts10806さん はい、すみませんでした。 デバッグを行い、最終行のreturn nullまで到達していることを確認しました。 fileのexistにも引っかかっておらず、パスも正しいようでした。 そのためやはりエラー出力はなにもされていませんでした…
m.ts10806

2020/08/25 21:20

分岐と変数を全て確認してください。exceptionでログ出力しか書いてないのでしたらログにしかエラーは出てないと思いますが、ログファイルにも書かれてませんか?
dameo

2020/08/27 05:47

Content-DispositionとPragmaが画像についてたのを見たことがないです。 とりあえず不要なヘッダ消して試してみてください。 PDFはViewerを内部で起動してブラウザ内部でinline表示するためにContent-Dispositionを付けてると思います。画像でその手の処理は普通しないので、おかしなことが起きてる可能性があると思い、コメントさせてもらいました。試してないので、違うかも知れませんが、正直コレ以上お手伝いする必要があるとも思えないので、間違っててもそのままいなくなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問