- PR -

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

投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-01-30 11:19
もし、ファイルの自動判別対象が特定の形式に限られるのであれば、
対象ファイルのフォーマットを見た上で特徴的な部分を判別することは可能です。
たとえばJavaのclassファイルなら先頭4バイトが
CA FE BA BE
になっていると決められているので判断しやすい。

別に森羅万象のファイルを識別したいわけではないでしょうから、
ターゲットとしているファイル形式に絞って自動判別を行うなら
それなりの工数でやれるのかもしれませんね。
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2007-02-08 14:20
インギさん、nagiseさん、ありがとうございます。

返事が遅くなり申し訳ございませんでした。

>Windows でも名前を変えて拡張子を取り除いてしまうとうまく開けないことがありますよね?
まさに仰る通りです。
拡張子のないファイルは対象外とする仕様にしました。

で、教えて頂いたURLを参考に、主要なMIMEタイプをweb.xmlに記述したのですがドキュメント類が上手く行きません。
上手く行かないというのは、ブラウザに化けた文字がずらっと表示されます。
画像はちゃんと表示されます。
PDFはバックグラウンドでAcroRd32.exeは起動するのですが、真っ白に表示されます。

web.xmlには以下を追記しました。
コード:
	<mime-mapping>
		<extension>gif</extension>
		<mime-type>image/gif</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>jpg</extension>
		<mime-type>image/jpeg</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>jpeg</extension>
		<mime-type>image/jpeg</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>png</extension>
		<mime-type>image/png</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>bmp</extension>
		<mime-type>image/bmp</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>tif</extension>
		<mime-type>image/tiff</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>tiff</extension>
		<mime-type>image/tiff</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>doc</extension>
		<mime-type>application/msword</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>xls</extension>
		<mime-type>application/msexcel</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>ppt</extension>
		<mime-type>application/mspowerpoint</mime-type>
	</mime-mapping>
	<mime-mapping>
		<extension>pdf</extension>
		<mime-type>application/pdf</mime-type>
	</mime-mapping>



サーブレットでは以下のように処理を行っています。
コード:
byte[] bin = バイナリ取得();

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



MIMEタイプをweb.xmlに追記しただけではダメなのでしょうか?

宜しくお願いします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-08 14:27
引用:

OZさんの書き込み (2007-02-08 14:20) より:
上手く行かないというのは、ブラウザに化けた文字がずらっと表示されます。
画像はちゃんと表示されます。
PDFはバックグラウンドでAcroRd32.exeは起動するのですが、真っ白に表示されます。



実際にサーバからどのようなデータが送られているかを見ないとなんとも。
HTTPのパケットをキャプチャするソフトがいろいろ出てますので
どんなレスポンスが来ているのか調べると何か分かるかもしれません。

MIMEタイプと別にエンコードが指定されていて不整合になっているとか
そういうケースでページがうまく表示できないことがあります。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-02-08 14:48
mime-mapping の設定はサーブレットコンテナ内蔵の静的ファイルを送信するサーブレットが参照します。
自分でファイルを送る場合については1月26日にひろ@yaさんが説明されていますね。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-08 15:03
引用:

インギさんの書き込み (2007-02-08 14:48) より:
mime-mapping の設定はサーブレットコンテナ内蔵の静的ファイルを送信するサーブレットが参照します。
自分でファイルを送る場合については1月26日にひろ@yaさんが説明されていますね。



しまった。そうでした。うっかりしていました。
web.xml側で対処するところじゃないですね… orz
ちなみに、[TOMCAT_HOME]/conf/web.xml にこれら静的ファイル転送の際の
MIMEタイプの記述があります。
通常はこの設定が用いられるため、個別のアプリでweb.xmlに
設定する必要はありません。
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2007-02-08 15:23
インギさん、nagiseさん、ありがとうございます。

>mime-mapping の設定はサーブレットコンテナ内蔵の静的ファイルを送信するサーブレットが参照します。

まさにこれが原因でした。
getServletContext().getMimeType(ファイル名)
でMIMEタイプを取得し、setContentTypeを行うと成功しました!

>ちなみに、[TOMCAT_HOME]/conf/web.xml にこれら静的ファイル転送の際の
>MIMEタイプの記述があります。
>通常はこの設定が用いられるため、個別のアプリでweb.xmlに
>設定する必要はありません。
ありがとうございます。
現在使用しているJ2EEエンジンはSAPなのです。。。
後学のため参考にさせて頂きます。

ほぼ問題が解決したのですが、pptファイルのみインラインで表示されずにPowerPointが起動してしまいます。
これはどういった原因が考えられるでしょうか?

宜しくお願いします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-08 21:32
引用:

OZさんの書き込み (2007-02-08 15:23) より:
ほぼ問題が解決したのですが、pptファイルのみインラインで表示されずにPowerPointが起動してしまいます。
これはどういった原因が考えられるでしょうか?



クライアントの設定じゃないでしょうか。
IEの場合はIEではないエクスプローラーのファイルタイプの設定が影響します。
サーバー側は意向を伝えることはできても、どう捕らえるかはクライアントの
方針次第なので100%確実にクライアントを制御することはできません。

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