- PR -

jsp サーブレット  画像表示

投稿者投稿内容
未記入
会議室デビュー日: 2007/07/18
投稿数: 3
投稿日時: 2007-07-18 22:02
いつもお世話になっています。jspに画像ファイルを表示させようとしてがんばってはみたもののどうしても表示されません。他のスレッドなんかで見てまねてはみたのですが・・。
package action;

import java.io.*;
import java.util.Iterator;
import javax.servlet.*;

public class Gazou extends HttpServlet{

public void doPost (HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException{

int data;
response.setContentType("image/jpeg");
PrintWriter out = response.getWriter();
// ServletOutputStream out = response.getOutputStream();
BufferedInputStream in = new BufferedInputStream(new FileInputStream("表示させたい.jpg"));
while ((data = in.read()) != -1) {
out.write(data);
}
}
}
jspでは無理というスレッドがあったのでサーブレットに生コードを
書いて表示させたのですが、最初にServletOutputStreamで表示したところ
例外でgetWrete()がでたので、PrintWriterに変えてみたところ画像ファイル
らしき形跡は表示できたのですが、
中身が表示されないのです。パスはあってるとおもいます。色々とたしかめて
みました。FilenameFilter()をつかってフォルダの中身を確認したり、
パスを変えてみるとnot foundが返ってきたりするので
ファイル自体には当たっているみたいなのですが
どうしてもダメでした。
どうかよろしくお願いします。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2007-07-18 22:20
引用:

未記入さんの書き込み (2007-07-18 22:02) より:
いつもお世話になっています。jspに画像ファイルを表示させようとしてがんばってはみたもののどうしても表示されません。他のスレッドなんかで見てまねてはみたのですが・・。


「表示させよう」じゃなくて「ダウンロードさせよう」じゃないの?
コードを見る限り、そのように見えます。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2007-07-18 22:31
画像を表示するだけなら適当な場所に画像を置いてimgタグで表示させればいいんじゃ?

Servletで動的に画像を作る場合はresponse.getOutputStream()で得られたストリームに画像データを流し込んであげればできます。
コンテンツタイプの設定も忘れずに。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-18 22:58
確かJSPでも可能だけど、JSPといいつつ全面スクリプトレットに
なってしまうのでJSPである意味がない、という話。

開発の仕方としては

1.画像のURL(〜.jpgなど)でServletを呼び出すようにweb.xmlを編集して呼び出しテスト
2.1で呼び出したServletで静的ファイルから読み出した画像ファイルのバイナリ列をRequestから取得したOutputStreamに書き出しすようにし、URLを直接叩いて表示確認
3.2で静的ファイルから画像を読み出した部分を動的に作った画像からImageIOで作ったバイナリに変更して表示確認
4.3のURLを静的HTMLにimgタグで埋め込んで表示確認
5.4の静的HTMLをJSPにして動的コンテンツから動的画像を呼ぶようにして表示確認

みたいに順番にやっていくとよいでしょう。
一度に作ろうとせず、わからない部分をひとつずつ確認するのがコツです。これを急がば回れといいます。

Webシステムなんてのは、基本的にHTTPの要求にファイルを返すだけのシステムです。
通常はそれがHTMLで、かつ、動的に生成されたものであるということ。
それがCSVになろうがXMLになろうが、画像になろうが、要はファイルを返すだけです。
未記入
会議室デビュー日: 2007/07/18
投稿数: 3
投稿日時: 2007-07-18 23:40
早速のご返答ありがとうございます。
そうなんです。HTMLでimgタグでもええじゃん。
と思うんですが。それがだめなんです。
画像をみせたいんですがパスは見せたくなかったんです。
なので、画像を描画するという作業がしたかったんです。
あとdogetで取り出したくなかったり、
FTPで画像ファイル自体ダウンロードさせたりしたら?とか
考えて
いろいろとためしては見たのですが...
とりあえず、皆様からいただいた
ヒントを頼りにかきだしてみます。
ありがとうございます。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2007-07-19 07:00
画像のパスをServletContext#getRealPathでとってないだけとかですかね?
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-19 08:01
ブラウザでそのサーブレットでどういうものがかえされますか?
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-07-19 10:44
引用:

PrintWriterに変えてみたところ画像ファイルらしき形跡は表示できたのですが、



画像データ出力する場合は、PrintWriterではダメですね。

以下ServletAPIのJavaDoc引用
引用:

バイナリデータを MIME のメッセージボディにセットして送り返す場合は getOutputStream() メソッドで取得できる ServletOutputStream オブジェクトを使ってください。また、 文字データを送り返す場合は、getWriter() メソッドにより取得できる PrintWriter オブジェクトを使ってください。



ブラウザは、PrintWriterのデフォルト文字エンコーディングでエンコード
されてしまったJPEGデータを表示しようとしてますね。

このコード
コード:

ServletOutputStream out = response.getOutputStream();


で例外スローされるということは、ドキュメントによると

以下ServletAPIのJavaDoc引用
引用:

例外:
IllegalStateException - このレスポンスですでに getWriter() メソッドが実行されていた場合
IOException - 入出力時に例外が発生した場合



ということなので、PrintWriterの取得コードをコメントアウトしない状態で、
getOutputStreamのコードを実行したということではないですかね。
・Javadocをよく読みましょう
・最低限try〜catchブロックで囲んで、スタックトレースをログ出力するようにしましょう




[ メッセージ編集済み 編集者: 小僧 編集日時 2007-07-19 10:56 ]

スキルアップ/キャリアアップ(JOB@IT)