- PR -

Content-Dispositionを使わないファイルのダウンロード

投稿者投稿内容
すめし
会議室デビュー日: 2005/01/04
投稿数: 10
投稿日時: 2005-01-04 17:26
Content-Dispositionのヘッダーを使わないでサーバにあるCSVファイルをクライアントにダウンロードダイアログを出してダウンロードさせる方法はありますか?
サーバはWebLogic8.1、ブラウザはIE6です。

「Content-Disposition」をファイアウォールのデフォルトの設定でははじくようになっていて、これを外すとセキュリティが甘くなるので外したくないと言われ、他の方法を探しています。
どうしてもContent-Dispositionが必要であれば、必要な理由等をそろえて説得しなければならないのです…
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-01-04 17:46
*.csv って URL でダウンロード用のサーブレットをマッピングするのはいかがでしょうか?
すめし
会議室デビュー日: 2005/01/04
投稿数: 10
投稿日時: 2005-01-04 18:18
引用:

インギさんの書き込み (2005-01-04 17:46) より:
*.csv って URL でダウンロード用のサーブレットをマッピングするのはいかがでしょうか?


すみません、具体的なやり方のヒントをもらうことはできないでしょうか?
ダウンロード用のサーブレットではヘッダーをどのようにセットするとか…
ダウンロードダイアログを出したり、ファイル名をセットするにはContent-Dispositionが必要といういうことになりませんか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-01-05 00:16
*.csvにマッピングを行えば、
ブラウザが静的なCSVファイルに対して
アクセスするのと同じことになります。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-01-05 02:32
まずは手を動かしてみましょう!
web.xml はこんな形になるでしょうか。とりあえずこれでファイル名については問題ないかと。
コード:
<servlet>
  <servlet-name>csvservlet</servlet-name>
  <servlet-class>yourpackage.CSVServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>csvservlet</servlet-name>
  <url-pattern>*.csv</url-pattern>
</servlet-mapping>



Content-Disposition ヘッダがダイアログ表示非表示にどう影響をあたえるかは存じないのですが、ダウンロードダイアログが表示されるかどうかはブラウザ依存(?)ではないでしょうか。content-type によってそのままブラウザで表示されたりダウンロードを促すダイアログがでたりしますね。いろいろ試してみてください。
すめし
会議室デビュー日: 2005/01/04
投稿数: 10
投稿日時: 2005-01-05 10:11
お返事ありがとうございます。
インギさんが書かれたweb.xmlの記述なども試してみましたが、理解できませんです。すみません。根本的にわかってないようです。

web.xmlに記述を追加してブラウザのURL欄にhttp://localhost:8080/xxx/hoge.csvと入れてyourpackage.CSVServletが起動はしましたが、このサーブレットにダウンロードの記述を書くということでしょうか?ダウンロードの記述とは
コード:
response.setContentType("Application/octetstream");
response.setHeader("Content-Disposition", "attachment;filename=\"" + "hoge.csv" + "\"");
// OutputStreamで出力・・・


といった感じになると認識していますが、多分見当違いだとは思うのですが、他の方法が思いつかない状況です。
書き漏れていましたが、
・CSVファイルの名称や内容は動的に変更あり
・ブラウザはIE6固定(とほほなwebシステムです)
となっております。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-01-05 10:40
小出しでわかりにくくてごめんなさい。

http://localhost:8080/xxx/hoge.csv とリクエストしているので Content-Disposition を使わなくても別途ファイル名を指定しなくてもいいかも? と思いました。
setHeader("Content-Disposition"... の箇所をコメントアウトしたらどうでしょう。

[ メッセージ編集済み 編集者: インギ 編集日時 2005-01-05 10:41 ]
すめし
会議室デビュー日: 2005/01/04
投稿数: 10
投稿日時: 2005-01-05 13:31
いえ、こちらこそすみません。基礎から勉強しなおさなきゃだめですね…
おかげさまでやりたい事の9割はできました。本当にありがとうございます。
「setHeader("Content-Disposition"... の箇所をコメントアウト」で、
hoge.csvという名前でダウンロードできました。

残りの1割というのは書き漏れていましたが、strutsを使っているシステムだったので
hoge.doとURLに書くところを、hoge.csvにすると、下記のようにweb.xmlに追記すればできるんですが、本当はCSVのファイル名にユーザIDをつけて"hoge012345.csv"のような感じにしたかったんですが、strutsだとそれは無理かと思い諦めています。

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.csv</url-pattern>
</servlet-mapping>


#あと、ここの過去の投稿にあったように
setContentType("Application/Octet-Stream")
とすると、FireFox等ではダウンロードダイアログがでましたが

setContentType("Application/Octet-Stream-Dummy")
としないと、IEではでませんでした。

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