ファイルのダウンロード
一般的に、HTTP GET / POSTリクエストに対するサーバの応答データをブラウザが解釈できない形式である場合には、特異点がない以上、ブラウザは、ターゲットを、添付ファイルのようにダウンロードする。
例えば、Anchor(a)タグに設定されたハイパーリンクを介してダウンロードしたデータは、ブラウザが解釈することができるjpgファイルであれば、別ウィンドウ(またはタブ)、または現在のウィンドウに画像が表示されるが、それとは別の方法でzipファイルの場合には、一般的に、すぐにダウンロードを実行する。 もしjpgファイルのようにブラウザが解釈することができるファイルをブラウザの処理に任せず、ディスクに直接ダウンロードするには、ブラウザ自体の機能(コンテキストメニュー - 名前を付けて保存)に依存したり、サーバーからブラウザが強制的にダウンロードできるようにするレスポンスヘッダを載せなければならない。 HTML5には、対象の型(mime type)に関係なく、強制的にファイルをダウンロードできるようにする属性が新たに追加されたが、すべてのブラウザでサポート(2016年初め基準)せずにおり、純粋にクライアントの設定だけでファイルをダウンロードすることができない。
DEXTUploadNJ製品は、サーバーのファイルまたはファイルではなく、データをブラウザの解釈なし添付ファイルの形で直接ダウンロードすることができるように処理をする。
// リソースをそのまま公開する場合だ。 <a href="http://ドメイン/パス/music/Beethoven/Moonlight.mp3">ベートーベン月光ソナタ</a> // download.doパスを使用してサルジェファイルのパスを公開せずにダウンロードすることができている。 <a href="http://ドメイン/パス/download.do?key=12345">ベートーベン月光ソナタ</a>
一般的に、DEXTUploadNJ製品を使用してダウンロードをするということは、対象ファイルのパスを隠匿したり、またはリンク先のファイルのパスは、Webに公開されていない環境である場合である。 したがって、ファイルをダウンロードするには、ファイルをダウンロードすることができ、JSPページまたはサーブレットを提供しなければならない。
- DEXTUploadNJ + サーブレット
-
ファイルをダウンロードするためにFileDownloadクラスを使用する。
public class DownloadServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); try { String key = request.getParameter("key"); // keyに対応するファイルのパスを得る。 // ... 省略 File target = new File("ファイルのパス"); FileDownload dextnj = new FileDownload(); dextnj.download(request, response, target, "ダウンロードしたときに使用するファイル名", "application/octet-stream", false); } catch (Exception e) { throw new ServletException(e); } } }ファイルのダウンロードをするとき、クライアントでは、GETではなく、POSTでリクエストすることをお勧めしていない。 ファイルのダウンロードされるのは、クライアントのデータをサーバーに送信して状態を更新することが目的ではないからである。 加えて、Java Webアプリケーション環境では、バイナリデータを得ようとするときは、JSPページではなく、サーブレットを直接定義して使用することを推奨します。 JSPページの場合は、ページに含まれているタグがダウンロードデータと重ねて書き込ま可能性が多い。もちろんページに表示器を除いた残りの部分をすべての要素を削除するとされるが、開発者のミスにより空の文字列のような部分が残る可能性があるため、問題が発生する可能性のある素地が高い。 したがって、サーブレットを直接定義して使用することをお勧めします。
- DEXTUploadNJ + Spring Web Framework
-
Spring環境でファイルをダウンロードするためにDEXTUploadNJFileDownloadViewビュークラスを提供する。
@Controller public class DownloadController { @RequestMapping(value = "/download.do", method = RequestMethod.GET) public ModelAndView download(@RequestParam(value = "key") String key) { // keyに対応するファイルのパスを得る。 // ... 省略 File target = new File("ファイルのパス"); // ファイルをダウンロードするためにDEXTUploadNJFileDownloadViewオブジェクトを生成する。 DEXTUploadNJFileDownloadView view = new DEXTUploadNJFileDownloadView(); view.setFile(target); view.setFilename("ダウンロードしたときに使用するファイル名"); view.setMime("application/octet-stream"); view.setCharsetName("UTF-8"); // ダウンロードタスクを処理するビューオブジェクトを返します。 return new ModelAndView(view); } }