こんにちは。
web画面でファイルを複数選択し、選択されたファイルをダウンロードする際の実装方法について、お力添えいただきたいと思います。
<使用ツール>
Windows7、IE9、Javascript、Java1.6、struts
<要件>
1.選択したファイルはzipにしない
2.選択できるファイル数に制限はない
3.ファイルサイズは個々で異なる
4.ファイル数分のwindowは開きたくない
5.ファイルの保存はユーザーが行う(ファイル名の変更など)
Javascriptを用いてファイル数分のwindowを開いてダウンロードを行うことはできたのですが、要件4.に該当してしまうので、1画面内で実装したいと考えています。
<% String fileName = (String)request.getParameter("FILE"); %>
<html> <scrpit> function windowReload() { // リクエストにファイル名を設定するメソッドの実行 document.forms[0].method="setFile"; document.forms[0].submit(): } </script> <body onload="windowReload()"> <iframe src='<%= "download.do?FILE=" + fileName %>'> </iframe> </body> </html>上記のように、一つ目のファイルをwindow.open()実行時にリクエストに指定し、以降はsetFile()を呼び出すようにし、ダウンロード自体はiframeでの「download.do」で実行しようとしたのですが、wineowReload()が呼び出されるたびにダウンロード処理が中断してしまい、処理を行うことができませんでした。
上記処理について、ご教授の程宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
こんちには。
Ajaxでファイルダウンロード用のServletをファイル数分呼び出し、
ファイルダウンロード用のServlet側では、responseにファイルのStreamを直接セットし、
fowardはさせないようにすればできると思います。
投稿2015/07/05 07:21
編集2015/07/05 07:23退会済みユーザー
総合スコア0
0
ベストアンサー
こんにちわ。
申し訳ありませんが、コメントではコードハイライトが使えないので、また別で起こしました。
ChromeとIEで挙動が違うとのことでしたので少し調べました。
レスポンスのContentType
とHeader
にセットする内容で、挙動が変わるようです。
都合のよいものは見つけられませんでした。
このアプローチの仕方では、User-Agent
でContentType
とHeader
にセットするものを切り替えるといった方法でしか対応が不可能かもしれません。
eripongさんからご提示頂いている方法もご検討ください。
以上、よろしくお願いいたします。
lang
1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5</head> 6<body> 7 <button id="btn">クリック!</button> 8 <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script> 9 <script> 10 $(function(){ 11 $('#btn').click(function(){ 12 for (var i=0; i<3; i++) { 13 var ifrm = '<iframe style="display:none" src="http://localhost:8080/test/Download" />'; 14 $(ifrm).appendTo('body'); 15 } 16 }); 17 }); 18 </script> 19</body> 20</html>
lang
1package test; 2 3import java.io.FileInputStream; 4import java.io.IOException; 5import java.io.InputStream; 6 7import javax.servlet.ServletException; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12import org.apache.commons.io.IOUtils; 13 14public class DownloadServlet extends HttpServlet { 15 16 @Override 17 protected void doGet(HttpServletRequest req, HttpServletResponse resp) 18 throws ServletException, IOException { 19 20 InputStream inStream = new FileInputStream("c:\\test.txt"); 21 IOUtils.copy(inStream, resp.getOutputStream()); 22 23 // Chrome:3回DL IE:1回DL 24// resp.setContentType("text/plain"); 25// resp.setHeader("Content-Disposition", "attachment; filename=\"test.txt" + "\""); 26 27 // Chrome:3回DL IE:1回DL 28// resp.setContentType("application/pdf"); 29// resp.setHeader("Content-Disposition", "attachment; filename=\"test.txt" + "\""); 30 31 // Chrome:無反応 IE:無反応 32// resp.setContentType("text/plain"); 33// resp.setHeader("Content-Disposition", "filename=\"test.txt" + "\""); 34 35 // Chrome:無反応、IE:3回DL 36// resp.setContentType("application/pdf"); 37// resp.setHeader("Content-Disposition", "filename=\"test.txt" + "\""); 38 39 System.out.println("動いた"); 40 } 41}
投稿2015/07/15 00:43
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
間違ってコメントの内容を投稿してしまいました。
ちょっと調べたので別の回答で上書きしておきます。
ここを見ると、
IEでも複数ファイルダウンロードできた、とあります。
これは使えないでしょうか?
投稿2015/07/14 14:58
編集2015/07/14 15:06総合スコア1546
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/14 22:41 編集
0
こんにちは。
試しに作った複数ファイルをダウンロードさせるだけのサンプルソースを添付しますので、
レスする形ではなく新たに起こしました。
同じファイルのままですが、複数ファイルのダウンロードができました。
iframeをファイル毎に別に用意してやらないと、ファイル数分のダウンロードリクエストが飛ばないようです。この辺が動かない理由ではないでしょうか。
lang
1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5</head> 6<body> 7 <button id="btn">クリック!</button> 8 <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script> 9 <script> 10 $(function(){ 11 $('#btn').click(function(){ 12 for (var i=0; i<3; i++) { 13 var ifrm = '<iframe id="ifrm" style="display:none" src="http://localhost:8080/schedule/Download" />'; 14 $(ifrm).appendTo('body'); 15 } 16 }); 17 }); 18 </script> 19</body> 20</html>
ご参考になればと思います。
以上、よろしくお願いいたします。
投稿2015/07/14 00:35
編集2015/07/14 00:37退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/14 11:28
退会済みユーザー
2015/07/14 12:04
2015/07/14 12:34
退会済みユーザー
2015/07/14 12:37
2015/07/14 12:44
退会済みユーザー
2015/07/14 12:53 編集
2015/07/14 14:45
2015/07/14 14:58
2015/07/14 14:59
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/05 13:34
退会済みユーザー
2015/07/06 04:00 編集
2015/07/09 13:59
退会済みユーザー
2015/07/10 12:24 編集
2015/07/13 14:47
2015/07/14 11:29 編集