- PR -

ダウンロード処理の件について

1
投稿者投稿内容
いのき
ベテラン
会議室デビュー日: 2005/10/06
投稿数: 88
投稿日時: 2005-12-28 10:36
いつもお世話になります。いのきです。

javaでダウンロード処理を行っているのですが、質問があります。

データのダウンロード処理は通常ダイアログが表示され、「開く」や「保存」を
行いますが、ダイアログを表示せず、そのまま保存することはできるでしょうか?

現在のダウンロード処理のソースを以下に記述します。
コード:
/**
 * <ダウンロード>処理 <br><br>
 */
public void doDownLoad(HttpServletRequest request, HttpServletResponse response,
 WebAction action) throws Exception {
	// CSV出力
	TextTable txtCsv = new TextTable();

	// ValueCacheから当TextTableの行列データを構築
	txtCsv.setValueCache(テーブルのValueCache);

	// テキストタイプ(CSVまたは固定長テキスト)を設定
	txtCsv.setType(TextTable.Type.CSV);

	// CSVデータ出力時にヘッダにはキャプションを出力する
	txtCsv.setHeaderType(TextTable.HeaderType.CAPTION);

	// CSVデータ出力時のテキストスキーマを設定(1行目以降[データ])
	txtCsv.setSchema(TextTable.Schema.ONLY_DATA);

	// エンコーディングを設定
	txtCsv.setEncoding("Shift_JIS");
	txtCsv.setActive(true);

	String header = "";
	if ("csvファイル名" != null && StringUtil.isNotNullString("csvファイル名")) {
		header += "filename=\\"" + "csvファイル名" + "\\"";
	}
	if (!header.equals("")) {
		response.setHeader("Content-Disposition", header);
	}

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

	OutputStream outputStream = response.getOutputStream();
	outputStream.write(txtCsv.exportTextString().getBytes("Shift_JIS"));
	outputStream.flush();
	outputStream.close();
	outputStream = null;

	// StopResponseを呼び出し、このシーケンスでは、
	// これ以降Ninja-VAによるResponse書き出しを行わない事を明示
	this.setStopResponse(true);
}



上記だとダイアログ表示され、しかもそのダイアログにあるチェック(何のチェックか忘れました・・・)を
はずすとダイアログが表示されず、ダイアログの「開く」と同じように、画面にダウンロード内容が
表示するだけになってしまいました。

よって、ダウンロード処理時は「指定したパスにデータをダウンロードしたファイルを保存するだけ」にしたい
のですが、可能でしょうか?

尚、環境は以下の通りです。
***** 環境 *****
OS:WinXP
DB:Oracle10g
JAVA:j2sdk1.4.2_08
ブラウザ:IE6.0
****************

以上、お忙しいところ申し訳ありませんが、宜しくお願い致します。
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-12-28 11:48
こんにちは、でっちです。

サーバから送出されたストリームをどう扱うかはクライアント側の振る舞いになるので、
サーバサイド処理ではどうやっても無理です。
制御したいのであれば、ActiveXなどクライアント側で動作するプログラムが必要になります。

ちなみに保存のダイアログは、
エクスプローラのツール中のフォルダオプションを開く
→ファイルの種類で該当の拡張子を選択
→詳細設定でファイルの種類の編集ダイアログを開き、「ダウンロード後に開く確認をする」をチェック
で再度表示されるようになると思います。

#「同じウィンドウで開く」のチェックを外すのかも。
#ちょっと記憶が混ざってるので自身がないです。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-28 12:22
セキュリティ上の問題がありますから、勝手にローカルに保存する事はできません。
でっちさんの仰るとおり、ActiveX等の外部プログラムを実行させる必要があります。

もし、自動でダウンロードが可能になった場合、
1.メールなどで悪意のあるURLへ誘導
2.スタートアップフォルダやsystem32フォルダ等にウィルスをダウンロード
3.安全そうなポータルサイト等にリダイレクト
の様な感じで、簡単にウィルスをばら撒く事が可能になります。

いのき
ベテラン
会議室デビュー日: 2005/10/06
投稿数: 88
投稿日時: 2005-12-28 13:16
いつもお世話になります。いのきです。

でっち6号さん、かつのりさん、ご回答、誠にありがとうございました。

サーバサイドでは無理なのですね。

では、これに関する質問内容を変えさせていただきます。
ダウンロード時に出力されるダイアログに関して、「開く」ボタンがなく
「保存」ボタンと「キャンセル」ボタンで構成されているダイアログを目にしました。
しかし、サイト等を調査しているのですが、その方法が見つかりません。
ご存知でしたら、教えていただけないでしょうか?

引用:

でっち6号さんの書き込み (2005-12-28 11:48) より:
ちなみに保存のダイアログは、
エクスプローラのツール中のフォルダオプションを開く
→ファイルの種類で該当の拡張子を選択
→詳細設定でファイルの種類の編集ダイアログを開き、「ダウンロード後に開く確認をする」をチェック
で再度表示されるようになると思います。

#「同じウィンドウで開く」のチェックを外すのかも。
#ちょっと記憶が混ざってるので自身がないです。


今回CSVファイルなので、拡張子が「CSV」の内容を調べたのですが、
・ダウンロード後に開く確認をする:チェックされている
・同じウィンドウで開く:チェックされていない(編集不可になっている)
でした。
この他にもダイアログを再び出力する方法はないでしょうか?
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-12-28 13:24
でっちです。

XPにはSP2は適用されてますか?
その場合拡張子「xls」側も調整しなければなりません。

引用:

ダウンロード時に出力されるダイアログに関して、「開く」ボタンがなく
「保存」ボタンと「キャンセル」ボタンで構成されているダイアログを目にしました。
しかし、サイト等を調査しているのですが、その方法が見つかりません。


それは該当ファイルを開くアプリがない場合のダイアログではないでしょうか?
いのき
ベテラン
会議室デビュー日: 2005/10/06
投稿数: 88
投稿日時: 2005-12-28 13:54
いつもお世話になります。いのきです。

でっち6号さん、ご回答ありがとうございました。
引用:

でっち6号さんの書き込み (2005-12-28 13:24) より:

XPにはSP2は適用されてますか?
その場合拡張子「xls」側も調整しなければなりません。


おっしゃる通り、SP2適用であるため、「xls」側を修正したらダイアログが表示されました。
ありがとうございます。

引用:

引用:

ダウンロード時に出力されるダイアログに関して、「開く」ボタンがなく
「保存」ボタンと「キャンセル」ボタンで構成されているダイアログを目にしました。
しかし、サイト等を調査しているのですが、その方法が見つかりません。


それは該当ファイルを開くアプリがない場合のダイアログではないでしょうか?



確かにそれは対象アプリがないファイルでした。
という事は、CSV形式でダウンロードするファイルに関しては「開く」ボタンをなくすのは
無理なのでしょうか?
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-12-28 21:49
でっちです。

おそらく無理でしょうね。とりあえず参考ページです。
FIX: Content-Disposition: Does not Force File Download Dialog
↑のページの下のほうにエクスプローラがファイルの種類を判断するため、ダウンロードを強制する方法はないってなことが書かれているようです。(英語弱いので間違ってるかもしれませんが)

抑止したいのは『同じページで開く』動作だけですかね?
それだけなら高さ0のフレームを使うとか何かしらの回避方法はありそうです。
(まあこれだと開いても何も起きないので、ユーザフレンドリじゃないですけど。)
静的ファイルならwindow.openでダウンロードとかお手軽な回避方法があるんですけどねー。

ところで今気付いたのですが、Content-Dispositionに"attachment;"が抜けてませんか?
[HOWTO] 既知の MIME タイプに対し [ファイルのダウンロード] ダイアログ ボックスを開く
いのき
ベテラン
会議室デビュー日: 2005/10/06
投稿数: 88
投稿日時: 2005-12-29 10:08
いつもお世話になります。いのきです。

でっち6号さん、ご回答ありがとうございました。

ダウンロードに関しては、別の回避策を検討致します。

なお、ご指摘がありましたように、「attachment」が抜けていました。
コード:
	String header = "";
	if ("csvファイル名" != null && StringUtil.isNotNullString("csvファイル名")) {
		header += "attachment; filename=\\"" + exportCsvFilename + "\\"";
	}
	if (!header.equals("")) {
		response.setHeader("Content-Disposition", header);
	}

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


にします。

ありがとうございました。
1

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