QA@IT

javaでURLから画像取得

9862 PV

javaで画像を取得したいです。
現状、例えば、http://localhost/test.htmlにアクセスすると、test1.htmlの

<img id="gazo" width="300" height="300" border="1" alt="" src="/test.JPG">

にアクセスするのですが、実際に見てみると画像が表示されません。javaコードは以下のようになっています(一部抜粋)。

URL target = new URL(getURL);
try {
    HttpURLConnection conn = (HttpURLConnection) target.openConnection(); //ここ3つ
    conn.setRequestMethod("GET");
    conn.connect();

    InputStream in = conn.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));

    String line = "";
    while((line = reader.readLine()) != null) {
        tmpBody.append(line);
    }
    html = tmpBody.toString();

    reader.close();
    in.close();
    conn.disconnect();

上記のコードで、HTML文書は読み込み、表示が可能なのですが、画像に関して上手くいきません。
BufferedReaderクラスでは画像の読み込みができないのでしょうか?

  • 回答に追記しました。 -

回答

htmlの話から突然javaの話になったように見えて、全体がよくわからないのですが、
~.htmlを呼び出すとサーブレットが呼ばれるような設定なんでしょうか?

それはおいておいて、

URL target = new URL(getURL);

の getURLが どういうときに読み込めないという話ですか?
とりあえず "http://localhost/test.JPG" など、test.JPG への正しいURLだったとして話を進めます。

http://docs.oracle.com/javase/jp/6/api/java/io/BufferedReader.html

public class BufferedReader
extends Reader
文字、配列、行をバッファリングすることによって、文字型入力ストリームからテキストを効率良く読み込みます。

とあるように、BufferedReaderはテキストを読み込むためのものですので、テキストでないJPGは読み込むことができません。
たとえば以下の様にバイト配列に取り出して処理します。

InputStream in = conn.getInputStream();
byte[] buf = new byte[4096];
int readSize;

while ( (readSize = in.read(buf)) != -1)
{
  // 読み込んだ buf (バイナリデータ)を処理する
}
in.close();

追記

ファイルに出力するには以下でできると思います。

InputStream in = conn.getInputStream();
byte[] buf = new byte[4096];
int readSize;

OutputStream fos = new FileOutputStream(filename);
while ( (readSize = in.read(buf)) != -1)
{
  fos.write(buf, 0, readSize);
}
fos.close();

in.close();

これでファイルは出来上がります。
ただし、PrintWriterで保存していると言われてる html経由で見せるには、imgタグのsrc属性の内容にあった場所にないとだめですのでそこは注意が必要です。

編集 履歴 (5)
  • .htmlと呼び出すとサーブレットが呼び出される形になっています。説明不足ですみません。
    テキストなどはPrintWriterクラスで出力させているのですが、画像はどのように出力すればよいのでしょうか?
    -
  • 分かりやすいご回答ありがとうございました! -
ウォッチ

この質問への回答やコメントをメールでお知らせします。