前提・実現したいこと
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; }
やることは同じで扱い方が違うだけかと思い上記のようにしてみたのですが、こちらでは新規タブが表示されコントローラーを呼び出しているようには見えるのですがブラウザ上に画像ファイルが表示されませんでした。
ログファイルも確認してみましたが特にエラーなどは発生していませんでした。
どうすればブラウザ上で画像ファイルを参照できるようになるでしょうか?
あなたの回答
tips
プレビュー