人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

アプリのダウンロード画面を作成しています。
外部からのアクセスを防ぐ為にjar,jamをWEB-INFに配置し、
クライアントがリンクを押下すると、サーブレットを呼び出し、ダウンロード処理する、というような仕組みで作業を進めています。

アプリ容量が少ない場合(50k)は成功したのですが、
多い場合(多分100k以上?)で試した場合、アプリ側からRangeヘッダ(部分的GET)が飛ばされるので、
それの対処として、「Rangeヘッダが付加されている場合は付加されたbyte数を返す」処理を追加したのですが、「このデータは取得できません」とエラーが出てしまいます。


この件、原因が分かる方、心当たりのある方、どうぞ宜しくお願いします。m(_ _)m


環境
TOMCAT5.5


※参考
取得Range= bytes=1340-295128

jarファイルに2回アクセスが来ている事から、
予想では、一度目の通信で0-1339まで受信し、
二度目の通信で1340-295128までを望んでいる、という感じだと思います。


●質問者: ピ
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:byte INF JAM JAR Web
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tsukasa57
●100ポイント ベストアンサー

たぶん、HTTPステータス・コードの200番を返しているからだと思う。206版を返すようにしてみたらどうでしょうか。

似たような問題に遭遇していたblog記事を見つけました。

http://youkand.cocolog-nifty.com/blog/2008/05/j2eeget_e813.html

◎質問者からの返答

さっそくの解答ありがとうございます。

そのURLも参考に作成しましたので、そこは問題ないと思います。

文字数制限の問題でソースを投稿できなくて申し訳ございません。

// Jarファイルのバイト配列作成

File file = new File(sc.getRealPath("/WEB-INF/Sample.jar"));

byte[] b = new byte[(int) file.length()];

{

BufferedInputStream bis = null;

try {

bis = new BufferedInputStream(new FileInputStream(file));

bis.read(b);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (bis != null) {

try {

bis.close();

} catch (IOException e) {

e.printStackTrace();

}

bis = null;

}

}

}


// レスポンスデータを生成

boolean isRange = false;

int off = 0;

int len = b.length;

String range = request.getHeader("Range");

if (range != null && range.length() != 0) {

range = range.substring(range.indexOf("=") + 1);

off = Integer.parseInt(range.substring(0, range.indexOf("-"))) + 1;

len = Integer.parseInt(range.substring(range.indexOf("-") + 1)) + 1;

isRange = true;

}

byte[] resData = new byte[len - off];



// コンテントヘッダを設定

response.setContentType("application/octet-stream");

response.setContentLength(resData.length);

if (isRange) {

response.setHeader("Content-Range", "bytes " + (off - 1) + "-" + (len - 1) + "/" + (b.length - 1));

response.setStatus(206);

}


// 送信

BufferedOutputStream bos = null;

try {

bos = new BufferedOutputStream(response.getOutputStream());

bos.write(resData);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (bos != null) {

try {

bos.close();

} catch (IOException e) {

e.printStackTrace();

}

bos = null;

}

}

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ