- PR -

jsp サーブレット  画像表示

投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-19 12:58
引用:

未記入さんの書き込み (2007-07-18 23:40) より:
そうなんです。HTMLでimgタグでもええじゃん。
と思うんですが。それがだめなんです。
画像をみせたいんですがパスは見せたくなかったんです。
なので、画像を描画するという作業がしたかったんです。



鼻で笑われるWebページのしつらえのひとつに「右クリック禁止」ってのがありますが、
なにやらそれを彷彿とさせる事例ですね

HTMLはimgタグで画像を表示するのが真っ当です。
どういう理由でそうしたくないのか、その意図するところを確認しましょう。

直リンクを禁止したいのであれば、IT mediaのようにrefererチェックで
対応する方法もあるでしょう。
あるいは、画像表示する外側のJSPを表示する時点でワンタイムURLを発行し、
imgタグを使って画像を表示するという手もあるでしょう。

JavaScriptでロード部分を独自化することで簡素な解析ではサーバ上の
画像ファイルを特定されないようにすることもできるでしょうが、
くだらないことに工数使うぐらいなら本来のサービスの質を向上させるほうがマシです。

画像を画像ファイルとして保管されたくないというのであれば、無理といいましょう。
HTMLのテーブルタグで1ピクセルのセルに背景色をつけることで画像のように見せるとか
くだらない手法はありますが、どうせ画面のハードコピーとったらそれまでです。

「XXをされたくない」といった本来の意図があるはずです。
そこをヒアリングして、もしそれがナンセンスな事項であれば説得する。
それなりの意義があるなら用途に合った手法を選ぶ、という対応が必要です。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-07-19 14:34
ソース表示でリアルなパスを見せたくないですか・・・
居る居る、力入れるところを間違ってるクライアントさんって。
大抵、工数掛かった割りに効果が薄いですね。

HTTPアクセスできない場所に保存している画像を出力したいという場合は、
はじめに書かれていたようなコードでやる必要がありますが、
画像ファイルをHTTPサーバ上に置いた状態でそのパスを知られたく
ないという要望だったら、こういった方法もありますよ。

JSP
コード:

<%
response.sendRedirect("http://・・・/・・・.jpg");
%>



HTML
コード:

<html>
<head>
<title></title>
<body >
<p>画像</p>
<img src="http://・・・/・・・.jsp">
</body>
</html>



実装はサーブレットでもJSPでも構わないです。GETパラメータに画像を指定する
るIDなどを一緒に指定すれば、画像指定もOKかと。クライアントキャッシュを
禁止するヘッダも一緒に出力しておくのも良いかもしれませんね。



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

[ メッセージ編集済み 編集者: 小僧 編集日時 2007-07-19 14:38 ]
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-19 23:41
コード:
package servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Class
 *
 * @web.servlet              name="images"
 *                           display-name="Name for images"
 *                           description="Description for images"
 * @web.servlet-mapping      url-pattern="/images"
 * @web.servlet-init-param   name="A parameter"
 *                           value="A value"
 */
@SuppressWarnings("serial")
public class images extends HttpServlet {

	public images() {
		// TODO Auto-generated constructor stub
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		File f = new File("/project/webapps2/www.asnet.com/20070717190223.jpg");
		System.err.println(f.exists());
		System.err.println(f.getAbsolutePath());
		resp.setContentType("image/jpeg");
		
		ServletOutputStream out = resp.getOutputStream();
		FileInputStream  in  = new FileInputStream(f);

		int sector = in.read();
		for (;sector != -1;sector = in.read()) {
			out.write(sector);
		}
		in.close();
		out.close();
	}
}


実際にソースを記述するとこんな感じになりますが
これをでも画像は取得可能です!!

未記入
会議室デビュー日: 2007/07/18
投稿数: 3
投稿日時: 2007-07-20 01:22
皆様、本当にありがとうございます。
今日も一日がんばってましたが
どうもダメですた。
画像のパスをServletContext#getRealPathでも
とってやってみましたが、結果は同じでした。
たぶん画像には行き着いているですが、表示するデータ違いなんでしょうか?
try catchでログ出力して眺めておわってしまいました。
「PrintWriterの取得コードをコメントアウトしない状態で、
getOutputStreamのコードを実行したということではないですかね。」
そうなんです!
response.getOutputStream()でストリームを生成

画像データ流し込み

PrintWriterで表示
みたいなのがいいのかと思ってましたが
PrintWriterで表示できないとなると....
ServletOutputStreamを使うとgetWriter()!
getWriter()の例外の"!"コレ。カッチン〜!
ServletOutputStreamを使わず、
jspWriterクラスなんか使ってみようと考えています。
それか、もとあるgetWriter()を殺すクラスとかAPIとかないんですかね
キャンセルというかなんというか....

とりあえず、もう少しがんばってみます。
皆様、ありがとうございます。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2007-07-20 06:43
Servletは画像のデータを出すだけじゃないんですか?
なにをPrintWriterに出したいんでしょうか?

んで、そのServletをimageとかいうURLとかで登録して
<img src="/xxxx/image" />
みたいにJSPからimgタグで見るんじゃないんですか?

1つのServletで画像のデータとHTMLの両方は出力できないですよ?
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-20 07:36
引用:

未記入さんの書き込み (2007-07-20 01:22) より:
皆様、本当にありがとうございます。
今日も一日がんばってましたが
どうもダメですた。
画像のパスをServletContext#getRealPathでも
とってやってみましたが、結果は同じでした。
たぶん画像には行き着いているですが、表示するデータ違いなんでしょうか?
try catchでログ出力して眺めておわってしまいました。
「PrintWriterの取得コードをコメントアウトしない状態で、
getOutputStreamのコードを実行したということではないですかね。」
そうなんです!
response.getOutputStream()でストリームを生成

画像データ流し込み

PrintWriterで表示
みたいなのがいいのかと思ってましたが
PrintWriterで表示できないとなると....
ServletOutputStreamを使うとgetWriter()!
getWriter()の例外の"!"コレ。カッチン〜!
ServletOutputStreamを使わず、
jspWriterクラスなんか使ってみようと考えています。
それか、もとあるgetWriter()を殺すクラスとかAPIとかないんですかね
キャンセルというかなんというか....

とりあえず、もう少しがんばってみます。
皆様、ありがとうございます。




重大な勘違いをおこしているかと思われる
どちらかが呼び出されて時点でもう片方にロックがかかる。

引用:

ServletResponse.html#getWriter

java.io.PrintWriter getWriter()
throws java.io.IOException

文字データをクライアントに送り返すのに使用する PrintWriter オブジェクトを返します。 PrintWriter は getCharacterEncoding() で返される文字エンコーディングを使用します。 レスポンスの文字エンコーディングが getCharacterEncoding で返す値に設定されていない (つまり、デフォルト値の ISO-8859-1 を返す) 場合、ISO-8859-1 になります。

PrintWriter の flash() メソッドを呼び出すとレスポンスがコミットされます。

このメソッドか getOutputStream() メソッドのどちらかをボディメッセージの出力に使用します。両方は使えません。

戻り値:
クライアントに文字データを送り返すことができる PrintWriter オブジェクト
例外:
UnsupportedEncodingException - getCharacterEncoding で返される文字エンコーディングが使用出来ない場合
java.lang.IllegalStateException - このレスポンスオブジェクトの getOutputStream メソッドがすでに実行されていた場合
java.io.IOException - 入出力時に例外が発生した場合
関連項目:
getOutputStream(), setCharacterEncoding(java.lang.String)




Servlet 2.4のJavaDoc(JA)
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-07-20 09:50
PrintWriterは文字を返すためのストリームです。
OutputStreamはバイナリを返すためのストリームです。

PrintWriterにこだわっているようですが、
一体何を返したいつもりなのでしょうか。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-07-20 10:19
引用:

たぶん画像には行き着いているですが、表示するデータ違いなんでしょうか?



って、書きましたけど...。

引用:

try catchでログ出力して眺めておわってしまいました。



スタックトレースの読み方が分からないということですね、大問題です。

引用:

ServletOutputStreamを使わず、
jspWriterクラスなんか使ってみようと考えています。



上辺だけの知識で事を進めようとして、完全に空回っていらっしゃいますね。

引用:

それか、もとあるgetWriter()を殺すクラスとかAPIとかないんですかね
キャンセルというかなんというか....



Kazukiさんも書かれていますが、HTMLと画像を同時に出力しようとしてませんか?。
限定的なクライアントを対象にした場合は、マルチパートというMIME形式で出力
したり、画像データ自体をHTMLに埋め込んだり、コンパイル済みHTMLなどもあるかと
思いますが、ほぼ使えません。

今やらなければいけないことは
・実現したいことを整理し直す
・みなさんの意見を参考に、自分の認識に誤りが無いかを再確認する
・提示されたコード内に実現したいことに近い動作をするコードがあったら、それを
いじって実装する
・スタックトレース出力の読み方を覚える
・Javadocをよく読む
・人の話を良く聞く



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

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