- PR -

サーブレットでのファイルダウンロードについて

投稿者投稿内容
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2007-01-26 15:12
いつもお世話になっています。

今回、バイナリデータを取得し、ブラウザ内に画像・ドキュメントを表示するサーブレットを作成しています。
基本的には下記のコードでできそうなのですが、何点か質問があるので助言頂ければと思います。
Windows2000 SP4
jdk1.4.0.7
IE 6.0.28

コード:
byte[] bin = バイナリ取得();

response.setHeader("Content-disposition", "inline; filename=\\"ファイル名\\"");
response.setContentType("image/jpeg");
OutputStream stream = response.getOutputStream();
stream.write(bin);



1点目はコンテントタイプの指定についてです。
取得するバイナリデータが何のファイルなのかが分からない場合、コンテントタイプには何を指定すれば良いでしょうか?
もしくはバイナリファイルを何のファイルか判別する方法はあるでしょうか?(拡張子から判別できない場合)
取得するバイナリファイルは、jpeg・gifといった画像ファイルとword・excel・pdfといったドキュメントファイルになります。


2点目は、ダウンロード画面を表示せず、ブラウザ内にファイルを開きたいのですが、極稀にブラウザ内にではなくアプリケーションが起動します。PowerPointですと100%再現します。
起動したアプリケーションを閉じ、ブラウザを更新するとブラウザ内に表示されます。
コード:
byte[] bin = バイナリ取得();

response.setHeader("Content-disposition", "inline; filename=\\"ファイル名\\"");
response.setContentType("application/powerpoint");
OutputStream stream = response.getOutputStream();
stream.write(bin);



宜しくお願いします。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-01-26 16:46
引用:

OZさんの書き込み (2007-01-26 15:12) より:
1点目はコンテントタイプの指定についてです。
取得するバイナリデータが何のファイルなのかが分からない場合、コンテントタイプには何を指定すれば良いでしょうか?
もしくはバイナリファイルを何のファイルか判別する方法はあるでしょうか?(拡張子から判別できない場合)
取得するバイナリファイルは、jpeg・gifといった画像ファイルとword・excel・pdfといったドキュメントファイルになります。


2点目は、ダウンロード画面を表示せず、ブラウザ内にファイルを開きたいのですが、極稀にブラウザ内にではなくアプリケーションが起動します。PowerPointですと100%再現します。



1)
バイナリデータを解析すれば可能ですが、
ファイルによって解析するべき場所が異なるので現実的ではありません。
拡張子で管理するか、それが出来ないのであれば対応表を用意したほうが良いでしょう。

2)
ダウンロードするサーブレットの呼び出しをいぢると上手くいきます。
具体的には、PDFをダウンロードする場合は
http://〜/downloadServlet.pdf
PowerPointをダウンロードするときは
http://〜/downloadServlet.ppt
こうすることで思い通りに動作してくれます。
ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2007-01-26 17:34
コード:
getServletContext().getMimeType(ファイル名)


を使うことは出来ませんか?
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2007-01-26 19:20
ひろ@yaさん、ありがとうございます。

コード:
InputStream in = new ByteArrayInputStream(file);
String type = URLConnection.guessContentTypeFromStream(in);
in.close();			
response.getWriter().println(type);
response.getWriter().println(getServletContext().getMimeType("word"));


上記コードを試してみましたが、nullが返ってきました。

あすかさん、ありがとうございます。
コンテントタイプについてはまだ調査中なのですが、できないようであれば対応表を作ります。
引用:

2)
ダウンロードするサーブレットの呼び出しをいぢると上手くいきます。
具体的には、PDFをダウンロードする場合は
http://〜/downloadServlet.pdf
PowerPointをダウンロードするときは
http://〜/downloadServlet.ppt
こうすることで思い通りに動作してくれます。


申し訳ございません。
勉強不足で、2)が何を言わんとしているのか理解できませんでした。
拡張子がファイルを表す何かを作成するという事でしょうか?

宜しくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-01-26 19:59
恐らく"word"はファイル名ではないですよね?
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletContext.html#getMimeType(java.lang.String)

>コンテントタイプについてはまだ調査中なのですが、できないようであれば対応表を作ります
通常 web.xml に記載します。

>コンテントタイプについてはまだ調査中なのですが、できないようであれば対応表を作ります。
一覧はこちらにあります。
http://www.iana.org/assignments/media-types/
ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2007-01-26 20:07
通常、getMimeType()はファイル名から拡張子を取得して、
拡張子と mime-typeのマッピングテーブルから情報を取得します。

そのため、"word"ではなく、"word.doc"の様なファイル名を引数にする必要があります。

# 標準のマッピング設定に無い拡張子だとやはり null になります。
# その場合は Webアプリケーションの web.xml に mime-mapping を書いて下さい。
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2007-01-30 10:28
インギさん、ひろ@yaさん、ありがとうございます。
他作業のため返信が送れて申し訳ございませんでした。

>恐らく"word"はファイル名ではないですよね?
"word"はファイル名になります。
拡張子をなくして処理できるかどうかを確認していました。

>通常、getMimeType()はファイル名から拡張子を取得して、
>拡張子と mime-typeのマッピングテーブルから情報を取得します。
>
>そのため、"word"ではなく、"word.doc"の様なファイル名を引数にする必要があります。
やはりファイルの中身を解析し、mime-typeを判別する処理は難しいのでしょうか。。。

インギさんに教えて頂いたURLを参考に、もう少し考えてみます。
他に何か良い手があれば、助言頂けると非常にうれしいです。

返信が遅れ気味になるかもしれませんが、必ずチェックしますので宜しくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-01-30 11:08
>やはりファイルの中身を解析し、mime-typeを判別する処理は難しいのでしょうか。。。
Windows でも名前を変えて拡張子を取り除いてしまうとうまく開けないことがありますよね?
技術的にはある程度可能でしょうけれども、Java でそういったことをしてくれる汎用的なライブラリはないかもしれません。「難しい」と思います。

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