- PR -

ブラウザでのファイルダウンロード時にContentTypeが無視される

投稿者投稿内容
わか
常連さん
会議室デビュー日: 2003/12/14
投稿数: 47
お住まい・勤務地: 広島市
投稿日時: 2006-07-22 00:53
いつもお世話になります、わかです。

struts にて、データベースにBLOB形式で格納した画像(jpeg)やExcelファイルのダウンロードを
行いたいと考えています。

環境
JDK 1.5.0_06
struts 1.2.9
tomcat 5.5.17

以下は、該当のコード部分です
コード:
res.reset();
OutputStream out = res.getOutputStream();

// OutputStreamにバイナリデータを取り出す処理
getBlobData(out);	
		
String fileName  = "あいう.jpg";			
res.setBufferSize(1024);
res.setContentType("application/octet-stream; charset=UTF-8");
res.setHeader("Content-Disposition",
"attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));



ダウンロードされるファイルの種類に関わらず、
ブラウザにて「ファイルのダウンロード」ダイアログが表示されることを期待しているのですが、
バイナリとして取り出されるデータの種類によっては、「ファイルのダウンロード」が表示されず、ブラウザ上でデータが展開されてしまいます。
# application/octet-stream の指定だけでは不足なのでしょうか?

同様の事例を経験されたことのある方、ポインタのみでもかまいませんので、
アドバイス頂ければ幸いです。

最後までお読みいただき、ありがとうございました。

未記入
会議室デビュー日: 2006/05/07
投稿数: 18
投稿日時: 2006-07-22 00:59
自分も同様の経験があります。

application/octet-stream は 正式な MIME タイプのため

環境によってはブラウザで表示されてしまうことがあります。

application/octet-stream-dummy のように

実際には存在しないMIME タイプを設定すれば解決できると思います。

自分の場合はそれで解決できました。
わか
常連さん
会議室デビュー日: 2003/12/14
投稿数: 47
お住まい・勤務地: 広島市
投稿日時: 2006-07-22 13:30
未記入さん、アドバイスありがとうございます。

上記のコードを
コード:
res.setContentType("application/octet-stream-dummy");



と書き換えてみましたが、現象は変化せず、同様にブラウザ上で展開される場合があります。

試したファイルの拡張子は「lzh」、「jpg」、「zip」及び「txt」です。

上記のうち、lzhはバイナリデータが強引に文字列に変換され、ブラウザ上に表示され、
jpgはブラウザ内に画像として表示されました。
zip及びtxtについては、「ファイルのダウンロード」ダイアログが表示されました。(=期待する動作)

何か見落としている点がありますでしょうか。
お気づきになられた点があれば、ご指摘頂ければ幸いです。


ブラウザの環境
Microsoft Internet Explorer 6 SP2


[ メッセージ編集済み 編集者: わか 編集日時 2006-07-22 13:31 ]
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2006-07-22 17:36
引用:

未記入さんの書き込み (2006-07-22 00:59) より:
自分も同様の経験があります。

application/octet-stream は 正式な MIME タイプのため

環境によってはブラウザで表示されてしまうことがあります。

application/octet-stream-dummy のように

実際には存在しないMIME タイプを設定すれば解決できると思います。

自分の場合はそれで解決できました。


 これは良くありません。
解決できれば良いというものではないのですよ。
下記の例のように、レスポンスヘッダーに「attachment」の指定をするだけです。
https://www.stackasterisk.jp/tech/java/download01_01.jsp

こんなのJavaに限ったことではないです。
未記入
会議室デビュー日: 2006/05/07
投稿数: 18
投稿日時: 2006-07-23 22:21
引用:

 これは良くありません。
解決できれば良いというものではないのですよ。
下記の例のように、レスポンスヘッダーに「attachment」の指定をするだけです。
https://www.stackasterisk.jp/tech/java/download01_01.jsp

こんなのJavaに限ったことではないです。



解決の過程は記載していませんが

自分でもいろいろ試したり、同様の現象をググったりして見つけたものであって

別に解決できればいいという意味ではないです。

また、レスポンスヘッダーに「attachment」の指定をするだけです。

と書いていますが、サンプルコードにはすでにその記載がされていて、
(見た限りはコードが間違っているようには見えません)

それでも解決できないという質問ではないでしょうか。

SUK2
ベテラン
会議室デビュー日: 2005/12/27
投稿数: 69
投稿日時: 2006-07-23 23:28
引用:
また、レスポンスヘッダーに「attachment」の指定をするだけです。

と書いていますが、サンプルコードにはすでにその記載がされていて、
(見た限りはコードが間違っているようには見えません)

それでも解決できないという質問ではないでしょうか。


恐らく

レスポンスヘッダーに正しく「attachment」と「contentType」の指定をするだけです。

と言いたかったのでは?

どちらにせよtakuさんが提示してくださったURIのページに に回答が載っていますね。
ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2006-07-24 09:07
strutsをご使用ということはダウンロード対象のURLが ????.do になっているのではないですか?

IE6SP2は拡張子付きのURLからのダウンロードの時は拡張子無しのURLからのダウンロードと挙動が違います(セキュリティパッチの適用によって時々動作が変わりますが)。

attachment,content-Typeの設定を行ってもまだうまくいかないなら、ブラウザらからのリクエスト先は拡張子無しのサーブレットにしておき、そのサーブレットから、strutsのアクションへ forwardすることで対応できるかもしれません。

# 過去にも何度か strutsでファイルのダウンロードがうまくいかない話題が出ています。検索してみて下さい
わか
常連さん
会議室デビュー日: 2003/12/14
投稿数: 47
お住まい・勤務地: 広島市
投稿日時: 2006-07-24 21:24
みなさま、アドバイスありがとうございます。

以下の方法で解決(=content-typeに関わらず、ファイルのダウンロードダイアログを表示させる)しましたので、報告します。

私が試した手順は
1)Strutsのservlet-mappingを変更

/WEB-INF/web.xml を
コード:
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>



コード:
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>/do/*</url-pattern>
  </servlet-mapping>


に変更しました。

2)setContentTypeを行うタイミングを変更
コード:
res.reset();
OutputStream out = res.getOutputStream();

// OutputStreamにバイナリデータを取り出す処理
getBlobData(out);	
		
String fileName  = "あいう.jpg";			
res.setBufferSize(1024);
res.setContentType("application/octet-stream; charset=UTF-8");
res.setHeader("Content-Disposition",
"attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));

out.close();



コード:
res.reset();

String fileName  = "あいう.jpg";			
res.setBufferSize(1024);
res.setContentType("application/octet-stream; charset=UTF-8");
res.setHeader("Content-Disposition",
"attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));

OutputStream out = res.getOutputStream();
// OutputStreamにバイナリデータを取り出す処理
getBlobData(out);	

out.close();


に変更しました。

どなたかの参考となれば幸いです。
ありがとうございました。

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