2012-05-09 7 views
2

私はJava、JSP、Jettyを使用してWebサイトを開発しています。JSPで絶対パスで画像を表示

<img>タグのsrcに渡された画像パスに問題があります。

私のデータベースには、ユーザーの画像のLinux絶対パスがあります。私はこの値を取得し、 "src"属性に入れます。

私は例えば、パスを持っている:

  • は、この方法を作る

を/home/website/images/image1.png、画像は表示されません。 長いこと考えてみると、私は、OSの絶対パスへの道のりでは決してウェブサイトの画像を見たことがないので、当然だと結論づけました。

私が知る必要があることは何ですか?

Jettyの設定を変更する必要がありますか? Javaでコードを実行する必要がありますか?

Googleを介して検索すると、私はもっと混乱しました。私は説明をしたい。


UPDATE(26/03/2013)

私は、この問題を処理するこの方法を見つけた:

http://balusc.blogspot.com.br/2007/04/imageservlet.html

ありがとうBalusC! hauhauhahaua

答えて

0

URIで使用した言葉で判断すると、リソースを一意に識別するURLの代わりにsrc属性のファイルシステムにファイルへのパスを設定しているように見えます。

絶対パスはファイルシステムの絶対パスではなく、Webサーバーのルートから絶対パスです。さらに、これらのURLリソース識別子は、サーバー内のさまざまなフォルダや動的リソースにマップするように変更または変更することもできます。ここで

は一例です:サーバー上のファイルへの

パス:

/home/website/images/image1.png 

example.comが "ウェブサイト" フォルダにマップされます。相対URLを使用する場合

おそらく、あなたは見ているでしょう:

<img src="/images/image1.png" /> 
要約すると

<img src="http://example.com/images/image1.png" /> 

は、クライアント側のHTMLからサーバー上のリソースを識別するために、ファイルパスを使用すると、ちょうど間違っていると動作しません:

は、絶対URLを使用するには、HTTPスキームが必要になります。

2

実際、<img src>は、ローカルのディスクファイルシステムパスではなく、公開Web URLを参照する必要があります。あなたの画像は、HTTPリクエストで利用可能でなければなりません。それは、どういうわけかそれらを含める必要があるWebサーバーではなく、それらをダウンロードしなければならないWebブラウザです。

初心者のための最も簡単な方法は後に、リクエストパラメータやパス情報に基づいてFileInputStreamによってInputStreamとして画像コンテンツを取得し、それをHttpServletResponseOutputStreamに通常のJavaのIOの道を書き込みサーブレットを作成することですブラウザーが対処する方法を理解できるように、必要なHTTP応答ヘッダーを設定しておく必要があります。

String filename = request.getPathInfo(); 
File file = new File("/home/website/images", filename); 

response.setHeader("Content-Type", getServletContext().getMimeType(filename)); 
response.setHeader("Content-Length", String.valueOf(file.length())); 

InputStream input = new FileInputStream(file); 
OutputStream output = response.getOutputStream(); 
// Stream bytes the usual way. 

代替が/imagesのコンテキストパスを持つサーバへの新しいWebアプリケーションのコンテキストとして/home/website/imagesを追加することです:サーブレットは/images/*にマッピングされていると仮定して、あなたがhttp://example.com/contextpath/images/image1.pngとして画像を開く

例えば、 。この方法で画像はhttp://example.com/images/image1.pngで利用可能になります。あなたはservletcontainerのmake/versionにのみ依存しています。

server.setHandler(new WebAppContext("/home/webapp/images", "/images")); 

それとも、XMLによってそれを管理している:

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="resourceBase">/home/website/images</Set> 
    <Set name="contextPath">/images</Set> 
</Configure> 
+0

エクセレントを突堤のために、それはあなたがプログラムを管理している場合は、以下になります! 最初の解決策については、あまりにも多くの画像があるとすれば、効率的ではないでしょうか? 私がこの新しいWebAppContextをどこで設定するのか、もっと気に入った2ºのソリューションについて教えてください。 xmlファイルでもこれを行うことができますか? ありがとうございました! =] –

+0

同じコードをcontext.xmlに記述したのと同じですが、うまくいきませんでしたか? –

+0

申し訳ありませんが、 ''は ''でなければなりません。第1の解決法の効率に関しては、ストリーミングに関して悪いことではないが、ブラウザのキャッシュ要求を尊重しない。 – BalusC

関連する問題