teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

検証したコードを記載しました。

2016/06/14 05:42

投稿

argius
argius

スコア9396

answer CHANGED
@@ -12,4 +12,68 @@
12
12
 
13
13
  ブラウザーの種類やHTML側の処理にもよるかもしれません。
14
14
  ChromeとFirefoxで`a`タグの`target="_blank"`にしてタブを開いてダウンロードさせてみましたが、
15
- タブが閉じないというのは確認できませんでした。
15
+ タブが閉じないというのは確認できませんでした。
16
+
17
+ ---
18
+
19
+ (追記)
20
+
21
+ 検証したコードです。
22
+
23
+ アプリケーションサーバーはTomcat8です。
24
+
25
+ ```lang-java
26
+ // import省略
27
+
28
+ @WebServlet("/servlet1")
29
+ public final class Servlet1 extends HttpServlet {
30
+ private static final long serialVersionUID = 1L;
31
+
32
+ @Override
33
+ protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
34
+ doUpdateExcel(req, response);
35
+ System.out.println("end of doGet"); // ダウンロード後に出力される
36
+ }
37
+
38
+ protected void doDownload(HttpServletResponse response) throws IOException {
39
+ response.setContentType("application/octet-stream");
40
+ String fileName = null;
41
+ try {
42
+ fileName = new String(getExcelFileName().getBytes("Windows-31J"), "ISO-8859-1");
43
+ } catch (UnsupportedEncodingException e1) {
44
+ e1.printStackTrace();
45
+ }
46
+ response.setHeader("Content-Disposition", "attachments; filename=\"" + fileName + "\"");
47
+ response.setHeader("Cache-Control", "public");
48
+ response.setHeader("Pragma", "public");
49
+
50
+ // どうやって作っているか分からないのでとりあえずローカルのファイルを開く
51
+ Workbook wb = new XSSFWorkbook("../" + getExcelFileName());
52
+ try {
53
+ OutputStream out = new BufferedOutputStream(response.getOutputStream());
54
+ wb.write(out);
55
+ } catch (IOException e) {
56
+ e.printStackTrace();
57
+ } finally {
58
+ try {
59
+ wb.close();
60
+ } catch (IOException e) {
61
+ e.printStackTrace();
62
+ }
63
+ }
64
+ }
65
+
66
+ protected void doUpdateExcel(HttpServletRequest request, HttpServletResponse response) throws ServletException,
67
+ IOException {
68
+ // --- エクセルを生成する処理 ---
69
+
70
+ doDownload(response); // ここで上記のエクセルダウンロードを呼び出すと、タブが自動で閉じられない
71
+
72
+ }
73
+
74
+ private String getExcelFileName() {
75
+ return "dltest.xlsx";
76
+ }
77
+
78
+ }
79
+ ```