回答編集履歴

2

zipOutStream.close(); の追加

2020/03/05 06:19

投稿

tsukari
tsukari

スコア7

test CHANGED
@@ -1,6 +1,14 @@
1
1
  参考にさせていただいた内容をもとに、以下のように実装しました。
2
2
 
3
3
  ※パラメータの inputStream は MultipartFile から作成したもので、zip ファイルです。
4
+
5
+
6
+
7
+ バイト配列の取得位置が try-with-resources ではまだ ZipOutputStream を close していない場所だったので、ret = baos.toByteArray(); の前に、明示的に zipOutStream.close(); を入れました。
8
+
9
+
10
+
11
+ これで、7-zipの場合の解凍時のペイロードのメッセージも無くなり、また、Windowsエクスプローラでのダブルクリックでも解凍できるようになりました。
4
12
 
5
13
 
6
14
 
@@ -10,7 +18,7 @@
10
18
 
11
19
 
12
20
 
13
- byte[] ret = new byte[1024];
21
+ byte[] ret = new byte[1048476];
14
22
 
15
23
 
16
24
 
@@ -108,6 +116,8 @@
108
116
 
109
117
  }
110
118
 
119
+ zipOutStream.close(); //追加 2020.03.05
120
+
111
121
  ret = baos.toByteArray();
112
122
 
113
123
  } catch (Exception e) {

1

最終的な実装は try-with-resources 文の記述に変更しました。

2020/03/05 06:19

投稿

tsukari
tsukari

スコア7

test CHANGED
@@ -6,21 +6,11 @@
6
6
 
7
7
  ```
8
8
 
9
- public byte[] sampleZip(InputStream inputStream) {
9
+ public byte[] sampleZip(InputStream inputStream) {
10
10
 
11
11
 
12
12
 
13
13
  byte[] ret = new byte[1024];
14
-
15
-
16
-
17
- ZipInputStream zipInStream = new ZipInputStream(new BufferedInputStream(inputStream), Charset.forName("SJIS"));
18
-
19
-
20
-
21
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
22
-
23
- ZipOutputStream zipOutStream = new ZipOutputStream(baos);
24
14
 
25
15
 
26
16
 
@@ -30,7 +20,13 @@
30
20
 
31
21
 
32
22
 
23
+ try (ZipInputStream zipInStream = new ZipInputStream(new BufferedInputStream(inputStream),
24
+
33
- try {
25
+ Charset.forName("SJIS"));
26
+
27
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
28
+
29
+ ZipOutputStream zipOutStream = new ZipOutputStream(baos);) {
34
30
 
35
31
  while ((zipEntry = zipInStream.getNextEntry()) != null) {
36
32
 
@@ -84,7 +80,7 @@
84
80
 
85
81
  XSSFWorkbook workbook = new XSSFWorkbook();
86
82
 
87
-
83
+
88
84
 
89
85
  workbook = addSheet(new ByteArrayInputStream(fileBin)); // addSheet:独自の関数
90
86
 
@@ -112,15 +108,9 @@
112
108
 
113
109
  }
114
110
 
115
- zipInStream.close();
116
-
117
- zipOutStream.close();
118
-
119
111
  ret = baos.toByteArray();
120
112
 
121
- } catch (IOException e) {
113
+ } catch (Exception e) {
122
-
123
- // TODO 自動生成された catch ブロック
124
114
 
125
115
  ret = null;
126
116