Intro
In this time, I will try generating and downloading files as ZIP.
If any error occurs during generation, generate and download a JSON file.
Generating a ZIP archive
First, I will load a CSV file and split it into multiple CSV files.
FileController.java
<span>package</span> <span>jp.masanori</span><span>;</span><span>import</span> <span>io.micronaut.http.annotation.Controller</span><span>;</span><span>import</span> <span>io.micronaut.http.annotation.Get</span><span>;</span><span>import</span> <span>io.micronaut.http.HttpResponse</span><span>;</span><span>import</span> <span>io.micronaut.http.server.types.files.SystemFile</span><span>;</span><span>@Controller</span><span>(</span><span>"/files"</span><span>)</span><span>public</span> <span>class</span> <span>FileController</span> <span>{</span><span>private</span> <span>final</span> <span>ResultCsvGenerator</span> <span>csvGen</span><span>;</span><span>public</span> <span>FileController</span><span>(</span><span>ResultCsvGenerator</span> <span>csvGen</span><span>)</span> <span>{</span><span>this</span><span>.</span><span>csvGen</span> <span>=</span> <span>csvGen</span><span>;</span><span>}</span><span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"zip"</span><span>)</span><span>public</span> <span>HttpResponse</span><span><</span><span>SystemFile</span><span>></span> <span>getZip</span><span>()</span> <span>{</span><span>SystemFile</span> <span>result</span> <span>=</span> <span>csvGen</span><span>.</span><span>generate</span><span>();</span><span>return</span> <span>HttpResponse</span><span>.</span><span>ok</span><span>(</span><span>result</span><span>)</span><span>.</span><span>contentType</span><span>(</span><span>"application/zip"</span><span>);</span><span>}</span><span>}</span><span>package</span> <span>jp.masanori</span><span>;</span> <span>import</span> <span>io.micronaut.http.annotation.Controller</span><span>;</span> <span>import</span> <span>io.micronaut.http.annotation.Get</span><span>;</span> <span>import</span> <span>io.micronaut.http.HttpResponse</span><span>;</span> <span>import</span> <span>io.micronaut.http.server.types.files.SystemFile</span><span>;</span> <span>@Controller</span><span>(</span><span>"/files"</span><span>)</span> <span>public</span> <span>class</span> <span>FileController</span> <span>{</span> <span>private</span> <span>final</span> <span>ResultCsvGenerator</span> <span>csvGen</span><span>;</span> <span>public</span> <span>FileController</span><span>(</span><span>ResultCsvGenerator</span> <span>csvGen</span><span>)</span> <span>{</span> <span>this</span><span>.</span><span>csvGen</span> <span>=</span> <span>csvGen</span><span>;</span> <span>}</span> <span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"zip"</span><span>)</span> <span>public</span> <span>HttpResponse</span><span><</span><span>SystemFile</span><span>></span> <span>getZip</span><span>()</span> <span>{</span> <span>SystemFile</span> <span>result</span> <span>=</span> <span>csvGen</span><span>.</span><span>generate</span><span>();</span> <span>return</span> <span>HttpResponse</span><span>.</span><span>ok</span><span>(</span><span>result</span><span>)</span> <span>.</span><span>contentType</span><span>(</span><span>"application/zip"</span><span>);</span> <span>}</span> <span>}</span>package jp.masanori; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.HttpResponse; import io.micronaut.http.server.types.files.SystemFile; @Controller("/files") public class FileController { private final ResultCsvGenerator csvGen; public FileController(ResultCsvGenerator csvGen) { this.csvGen = csvGen; } @Get(uri="zip") public HttpResponse<SystemFile> getZip() { SystemFile result = csvGen.generate(); return HttpResponse.ok(result) .contentType("application/zip"); } }
Enter fullscreen mode Exit fullscreen mode
sample.csv
--12345678Content-Disposition: mixed; name="sample"; filename="sample.csv";Content-Type: text/csvid,名前,メッセージ,タグ0,サンプル,こんにちは,debug1,サンプル2,世界,world2,サンプル3,こんばんは,debug3,サンプル4,おはよう,morning--abcdefghContent-Disposition: mixed; name="example"; filename="サンプル.csv";Content-Type: text/csvid,名前,メッセージ,タグ4,サンプル,こんにちは,debug5,サンプル2,世界,world6,サンプル3,こんばんは,debug7,サンプル4,おはよう,morning--12345678 Content-Disposition: mixed; name="sample"; filename="sample.csv"; Content-Type: text/csv id,名前,メッセージ,タグ 0,サンプル,こんにちは,debug 1,サンプル2,世界,world 2,サンプル3,こんばんは,debug 3,サンプル4,おはよう,morning --abcdefgh Content-Disposition: mixed; name="example"; filename="サンプル.csv"; Content-Type: text/csv id,名前,メッセージ,タグ 4,サンプル,こんにちは,debug 5,サンプル2,世界,world 6,サンプル3,こんばんは,debug 7,サンプル4,おはよう,morning--12345678 Content-Disposition: mixed; name="sample"; filename="sample.csv"; Content-Type: text/csv id,名前,メッセージ,タグ 0,サンプル,こんにちは,debug 1,サンプル2,世界,world 2,サンプル3,こんばんは,debug 3,サンプル4,おはよう,morning --abcdefgh Content-Disposition: mixed; name="example"; filename="サンプル.csv"; Content-Type: text/csv id,名前,メッセージ,タグ 4,サンプル,こんにちは,debug 5,サンプル2,世界,world 6,サンプル3,こんばんは,debug 7,サンプル4,おはよう,morning
Enter fullscreen mode Exit fullscreen mode
ResultCsvGenerator.java
<span>package</span> <span>jp.masanori</span><span>;</span><span>import</span> <span>java.io.BufferedOutputStream</span><span>;</span><span>import</span> <span>java.io.File</span><span>;</span><span>import</span> <span>java.io.FileOutputStream</span><span>;</span><span>import</span> <span>java.io.IOException</span><span>;</span><span>import</span> <span>java.nio.file.Files</span><span>;</span><span>import</span> <span>java.nio.file.Paths</span><span>;</span><span>import</span> <span>java.util.ArrayList</span><span>;</span><span>import</span> <span>java.util.HashMap</span><span>;</span><span>import</span> <span>java.util.List</span><span>;</span><span>import</span> <span>java.util.Map</span><span>;</span><span>import</span> <span>java.util.regex.Matcher</span><span>;</span><span>import</span> <span>java.util.regex.Pattern</span><span>;</span><span>import</span> <span>java.util.zip.ZipEntry</span><span>;</span><span>import</span> <span>java.util.zip.ZipOutputStream</span><span>;</span><span>import</span> <span>org.slf4j.Logger</span><span>;</span><span>import</span> <span>org.slf4j.LoggerFactory</span><span>;</span><span>import</span> <span>io.micronaut.http.server.types.files.SystemFile</span><span>;</span><span>import</span> <span>jakarta.inject.Singleton</span><span>;</span><span>import</span> <span>jp.masanori.dto.ResultCsv</span><span>;</span><span>@Singleton</span><span>public</span> <span>class</span> <span>ResultCsvGenerator</span> <span>{</span><span>private</span> <span>final</span> <span>Logger</span> <span>logger</span><span>;</span><span>private</span> <span>final</span> <span>Pattern</span> <span>cdPattern</span><span>;</span><span>private</span> <span>final</span> <span>Pattern</span> <span>beiPattern</span><span>;</span><span>public</span> <span>ResultCsvGenerator</span><span>()</span> <span>{</span><span>this</span><span>.</span><span>logger</span> <span>=</span> <span>LoggerFactory</span><span>.</span><span>getLogger</span><span>(</span><span>ResultCsvGenerator</span><span>.</span><span>class</span><span>);</span><span>this</span><span>.</span><span>cdPattern</span> <span>=</span> <span>Pattern</span><span>.</span><span>compile</span><span>(</span><span>"(Content-Disposition).+(filename=)\"(.+)\""</span><span>);</span><span>}</span><span>public</span> <span>SystemFile</span> <span>generate</span><span>()</span> <span>{</span><span>try</span> <span>{</span><span>byte</span><span>[]</span> <span>fileData</span> <span>=</span> <span>Files</span><span>.</span><span>readAllBytes</span><span>(</span><span>Paths</span><span>.</span><span>get</span><span>(</span><span>"C:/Users/example/sample.csv"</span><span>));</span><span>List</span><span><</span><span>ResultCsv</span><span>></span> <span>csvValues</span> <span>=</span> <span>new</span> <span>ArrayList</span><span><>();</span><span>String</span> <span>name</span> <span>=</span> <span>""</span><span>;</span><span>String</span> <span>value</span> <span>=</span> <span>""</span><span>;</span><span>String</span><span>[]</span> <span>splitted</span> <span>=</span> <span>new</span> <span>String</span><span>(</span><span>fileData</span><span>,</span> <span>"SJIS"</span><span>).</span><span>split</span><span>(</span><span>"\n"</span><span>);</span><span>for</span> <span>(</span><span>int</span> <span>i</span> <span>=</span> <span>0</span><span>;</span> <span>i</span> <span><</span> <span>splitted</span><span>.</span><span>length</span><span>;</span> <span>i</span><span>++)</span> <span>{</span><span>// split the value by "--"</span><span>if</span> <span>(</span><span>splitted</span><span>[</span><span>i</span><span>].</span><span>startsWith</span><span>(</span><span>"--"</span><span>))</span> <span>{</span><span>if</span> <span>(</span><span>name</span><span>.</span><span>length</span><span>()</span> <span><=</span> <span>0</span><span>)</span> <span>{</span><span>continue</span><span>;</span><span>}</span><span>ResultCsv</span> <span>result</span> <span>=</span> <span>new</span> <span>ResultCsv</span><span>(</span><span>name</span><span>,</span> <span>value</span><span>);</span><span>csvValues</span><span>.</span><span>add</span><span>(</span><span>result</span><span>);</span><span>name</span> <span>=</span> <span>""</span><span>;</span><span>value</span> <span>=</span> <span>""</span><span>;</span><span>continue</span><span>;</span><span>}</span><span>// get file names from "Content-Disposition" rows</span><span>Matcher</span> <span>cdMatcher</span> <span>=</span> <span>cdPattern</span><span>.</span><span>matcher</span><span>(</span><span>splitted</span><span>[</span><span>i</span><span>]);</span><span>if</span> <span>(</span><span>cdMatcher</span><span>.</span><span>find</span><span>())</span> <span>{</span><span>name</span> <span>=</span> <span>cdMatcher</span><span>.</span><span>group</span><span>(</span><span>cdMatcher</span><span>.</span><span>groupCount</span><span>());</span><span>continue</span><span>;</span><span>}</span><span>// skip "Content-Type" rows</span><span>if</span> <span>(</span><span>splitted</span><span>[</span><span>i</span><span>].</span><span>startsWith</span><span>(</span><span>"Content-Type"</span><span>))</span> <span>{</span><span>continue</span><span>;</span><span>}</span><span>// add other rows as values</span><span>if</span> <span>(</span><span>name</span><span>.</span><span>length</span><span>()</span> <span>></span> <span>0</span><span>)</span> <span>{</span><span>value</span> <span>+=</span> <span>splitted</span><span>[</span><span>i</span><span>];</span><span>value</span> <span>+=</span> <span>"\n"</span><span>;</span><span>}</span><span>}</span><span>if</span><span>(</span><span>name</span><span>.</span><span>length</span><span>()</span> <span>></span> <span>0</span><span>)</span> <span>{</span><span>ResultCsv</span> <span>result</span> <span>=</span> <span>new</span> <span>ResultCsv</span><span>(</span><span>name</span><span>,</span> <span>value</span><span>);</span><span>csvValues</span><span>.</span><span>add</span><span>(</span><span>result</span><span>);</span><span>}</span><span>return</span> <span>generateZipFile</span><span>(</span><span>csvValues</span><span>);</span><span>}</span> <span>catch</span><span>(</span><span>IOException</span> <span>ex</span><span>)</span> <span>{</span><span>logger</span><span>.</span><span>error</span><span>(</span><span>"Failed generating a ZIP file"</span><span>,</span> <span>ex</span><span>);</span><span>return</span> <span>null</span><span>;</span><span>}</span><span>}</span><span>private</span> <span>SystemFile</span> <span>generateZipFile</span><span>(</span><span>List</span><span><</span><span>ResultCsv</span><span>></span> <span>values</span><span>)</span> <span>throws</span> <span>IOException</span> <span>{</span><span>File</span> <span>tmpFile</span> <span>=</span> <span>File</span><span>.</span><span>createTempFile</span><span>(</span><span>"result"</span><span>,</span> <span>"zip"</span><span>);</span><span>try</span> <span>(</span><span>ZipOutputStream</span> <span>zip</span> <span>=</span> <span>new</span> <span>ZipOutputStream</span><span>(</span><span>new</span> <span>BufferedOutputStream</span><span>(</span><span>new</span> <span>FileOutputStream</span><span>(</span><span>tmpFile</span><span>))))</span> <span>{</span><span>for</span> <span>(</span><span>ResultCsv</span> <span>csv</span> <span>:</span> <span>values</span><span>)</span> <span>{</span><span>// add CSV files into ZIP archive</span><span>String</span> <span>fileName</span> <span>=</span> <span>csv</span><span>.</span><span>getName</span><span>();</span><span>if</span> <span>(</span><span>fileName</span> <span>==</span> <span>null</span><span>)</span> <span>{</span><span>continue</span><span>;</span><span>}</span><span>zip</span><span>.</span><span>putNextEntry</span><span>(</span><span>new</span> <span>ZipEntry</span><span>(</span><span>fileName</span><span>));</span><span>byte</span><span>[]</span> <span>value</span> <span>=</span> <span>csv</span><span>.</span><span>getValue</span><span>().</span><span>getBytes</span><span>(</span><span>"SJIS"</span><span>);</span><span>zip</span><span>.</span><span>write</span><span>(</span><span>value</span><span>,</span> <span>0</span><span>,</span> <span>value</span><span>.</span><span>length</span><span>);</span><span>}</span><span>}</span><span>// set ZIP file name</span><span>return</span> <span>new</span> <span>SystemFile</span><span>(</span><span>tmpFile</span><span>).</span><span>attach</span><span>(</span><span>"result.zip"</span><span>);</span><span>}</span><span>}</span><span>package</span> <span>jp.masanori</span><span>;</span> <span>import</span> <span>java.io.BufferedOutputStream</span><span>;</span> <span>import</span> <span>java.io.File</span><span>;</span> <span>import</span> <span>java.io.FileOutputStream</span><span>;</span> <span>import</span> <span>java.io.IOException</span><span>;</span> <span>import</span> <span>java.nio.file.Files</span><span>;</span> <span>import</span> <span>java.nio.file.Paths</span><span>;</span> <span>import</span> <span>java.util.ArrayList</span><span>;</span> <span>import</span> <span>java.util.HashMap</span><span>;</span> <span>import</span> <span>java.util.List</span><span>;</span> <span>import</span> <span>java.util.Map</span><span>;</span> <span>import</span> <span>java.util.regex.Matcher</span><span>;</span> <span>import</span> <span>java.util.regex.Pattern</span><span>;</span> <span>import</span> <span>java.util.zip.ZipEntry</span><span>;</span> <span>import</span> <span>java.util.zip.ZipOutputStream</span><span>;</span> <span>import</span> <span>org.slf4j.Logger</span><span>;</span> <span>import</span> <span>org.slf4j.LoggerFactory</span><span>;</span> <span>import</span> <span>io.micronaut.http.server.types.files.SystemFile</span><span>;</span> <span>import</span> <span>jakarta.inject.Singleton</span><span>;</span> <span>import</span> <span>jp.masanori.dto.ResultCsv</span><span>;</span> <span>@Singleton</span> <span>public</span> <span>class</span> <span>ResultCsvGenerator</span> <span>{</span> <span>private</span> <span>final</span> <span>Logger</span> <span>logger</span><span>;</span> <span>private</span> <span>final</span> <span>Pattern</span> <span>cdPattern</span><span>;</span> <span>private</span> <span>final</span> <span>Pattern</span> <span>beiPattern</span><span>;</span> <span>public</span> <span>ResultCsvGenerator</span><span>()</span> <span>{</span> <span>this</span><span>.</span><span>logger</span> <span>=</span> <span>LoggerFactory</span><span>.</span><span>getLogger</span><span>(</span><span>ResultCsvGenerator</span><span>.</span><span>class</span><span>);</span> <span>this</span><span>.</span><span>cdPattern</span> <span>=</span> <span>Pattern</span><span>.</span><span>compile</span><span>(</span><span>"(Content-Disposition).+(filename=)\"(.+)\""</span><span>);</span> <span>}</span> <span>public</span> <span>SystemFile</span> <span>generate</span><span>()</span> <span>{</span> <span>try</span> <span>{</span> <span>byte</span><span>[]</span> <span>fileData</span> <span>=</span> <span>Files</span> <span>.</span><span>readAllBytes</span><span>(</span><span>Paths</span><span>.</span><span>get</span><span>(</span><span>"C:/Users/example/sample.csv"</span><span>));</span> <span>List</span><span><</span><span>ResultCsv</span><span>></span> <span>csvValues</span> <span>=</span> <span>new</span> <span>ArrayList</span><span><>();</span> <span>String</span> <span>name</span> <span>=</span> <span>""</span><span>;</span> <span>String</span> <span>value</span> <span>=</span> <span>""</span><span>;</span> <span>String</span><span>[]</span> <span>splitted</span> <span>=</span> <span>new</span> <span>String</span><span>(</span><span>fileData</span><span>,</span> <span>"SJIS"</span><span>).</span><span>split</span><span>(</span><span>"\n"</span><span>);</span> <span>for</span> <span>(</span><span>int</span> <span>i</span> <span>=</span> <span>0</span><span>;</span> <span>i</span> <span><</span> <span>splitted</span><span>.</span><span>length</span><span>;</span> <span>i</span><span>++)</span> <span>{</span> <span>// split the value by "--"</span> <span>if</span> <span>(</span><span>splitted</span><span>[</span><span>i</span><span>].</span><span>startsWith</span><span>(</span><span>"--"</span><span>))</span> <span>{</span> <span>if</span> <span>(</span><span>name</span><span>.</span><span>length</span><span>()</span> <span><=</span> <span>0</span><span>)</span> <span>{</span> <span>continue</span><span>;</span> <span>}</span> <span>ResultCsv</span> <span>result</span> <span>=</span> <span>new</span> <span>ResultCsv</span><span>(</span><span>name</span><span>,</span> <span>value</span><span>);</span> <span>csvValues</span><span>.</span><span>add</span><span>(</span><span>result</span><span>);</span> <span>name</span> <span>=</span> <span>""</span><span>;</span> <span>value</span> <span>=</span> <span>""</span><span>;</span> <span>continue</span><span>;</span> <span>}</span> <span>// get file names from "Content-Disposition" rows</span> <span>Matcher</span> <span>cdMatcher</span> <span>=</span> <span>cdPattern</span><span>.</span><span>matcher</span><span>(</span><span>splitted</span><span>[</span><span>i</span><span>]);</span> <span>if</span> <span>(</span><span>cdMatcher</span><span>.</span><span>find</span><span>())</span> <span>{</span> <span>name</span> <span>=</span> <span>cdMatcher</span><span>.</span><span>group</span><span>(</span><span>cdMatcher</span><span>.</span><span>groupCount</span><span>());</span> <span>continue</span><span>;</span> <span>}</span> <span>// skip "Content-Type" rows</span> <span>if</span> <span>(</span><span>splitted</span><span>[</span><span>i</span><span>].</span><span>startsWith</span><span>(</span><span>"Content-Type"</span><span>))</span> <span>{</span> <span>continue</span><span>;</span> <span>}</span> <span>// add other rows as values</span> <span>if</span> <span>(</span><span>name</span><span>.</span><span>length</span><span>()</span> <span>></span> <span>0</span><span>)</span> <span>{</span> <span>value</span> <span>+=</span> <span>splitted</span><span>[</span><span>i</span><span>];</span> <span>value</span> <span>+=</span> <span>"\n"</span><span>;</span> <span>}</span> <span>}</span> <span>if</span><span>(</span><span>name</span><span>.</span><span>length</span><span>()</span> <span>></span> <span>0</span><span>)</span> <span>{</span> <span>ResultCsv</span> <span>result</span> <span>=</span> <span>new</span> <span>ResultCsv</span><span>(</span><span>name</span><span>,</span> <span>value</span><span>);</span> <span>csvValues</span><span>.</span><span>add</span><span>(</span><span>result</span><span>);</span> <span>}</span> <span>return</span> <span>generateZipFile</span><span>(</span><span>csvValues</span><span>);</span> <span>}</span> <span>catch</span><span>(</span><span>IOException</span> <span>ex</span><span>)</span> <span>{</span> <span>logger</span><span>.</span><span>error</span><span>(</span><span>"Failed generating a ZIP file"</span><span>,</span> <span>ex</span><span>);</span> <span>return</span> <span>null</span><span>;</span> <span>}</span> <span>}</span> <span>private</span> <span>SystemFile</span> <span>generateZipFile</span><span>(</span><span>List</span><span><</span><span>ResultCsv</span><span>></span> <span>values</span><span>)</span> <span>throws</span> <span>IOException</span> <span>{</span> <span>File</span> <span>tmpFile</span> <span>=</span> <span>File</span><span>.</span><span>createTempFile</span><span>(</span><span>"result"</span><span>,</span> <span>"zip"</span><span>);</span> <span>try</span> <span>(</span><span>ZipOutputStream</span> <span>zip</span> <span>=</span> <span>new</span> <span>ZipOutputStream</span><span>(</span><span>new</span> <span>BufferedOutputStream</span><span>(</span> <span>new</span> <span>FileOutputStream</span><span>(</span><span>tmpFile</span><span>))))</span> <span>{</span> <span>for</span> <span>(</span><span>ResultCsv</span> <span>csv</span> <span>:</span> <span>values</span><span>)</span> <span>{</span> <span>// add CSV files into ZIP archive</span> <span>String</span> <span>fileName</span> <span>=</span> <span>csv</span><span>.</span><span>getName</span><span>();</span> <span>if</span> <span>(</span><span>fileName</span> <span>==</span> <span>null</span><span>)</span> <span>{</span> <span>continue</span><span>;</span> <span>}</span> <span>zip</span><span>.</span><span>putNextEntry</span><span>(</span><span>new</span> <span>ZipEntry</span><span>(</span><span>fileName</span><span>));</span> <span>byte</span><span>[]</span> <span>value</span> <span>=</span> <span>csv</span><span>.</span><span>getValue</span><span>().</span><span>getBytes</span><span>(</span><span>"SJIS"</span><span>);</span> <span>zip</span><span>.</span><span>write</span><span>(</span><span>value</span><span>,</span> <span>0</span><span>,</span> <span>value</span><span>.</span><span>length</span><span>);</span> <span>}</span> <span>}</span> <span>// set ZIP file name</span> <span>return</span> <span>new</span> <span>SystemFile</span><span>(</span><span>tmpFile</span><span>).</span><span>attach</span><span>(</span><span>"result.zip"</span><span>);</span> <span>}</span> <span>}</span>package jp.masanori; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.micronaut.http.server.types.files.SystemFile; import jakarta.inject.Singleton; import jp.masanori.dto.ResultCsv; @Singleton public class ResultCsvGenerator { private final Logger logger; private final Pattern cdPattern; private final Pattern beiPattern; public ResultCsvGenerator() { this.logger = LoggerFactory.getLogger(ResultCsvGenerator.class); this.cdPattern = Pattern.compile("(Content-Disposition).+(filename=)\"(.+)\""); } public SystemFile generate() { try { byte[] fileData = Files .readAllBytes(Paths.get("C:/Users/example/sample.csv")); List<ResultCsv> csvValues = new ArrayList<>(); String name = ""; String value = ""; String[] splitted = new String(fileData, "SJIS").split("\n"); for (int i = 0; i < splitted.length; i++) { // split the value by "--" if (splitted[i].startsWith("--")) { if (name.length() <= 0) { continue; } ResultCsv result = new ResultCsv(name, value); csvValues.add(result); name = ""; value = ""; continue; } // get file names from "Content-Disposition" rows Matcher cdMatcher = cdPattern.matcher(splitted[i]); if (cdMatcher.find()) { name = cdMatcher.group(cdMatcher.groupCount()); continue; } // skip "Content-Type" rows if (splitted[i].startsWith("Content-Type")) { continue; } // add other rows as values if (name.length() > 0) { value += splitted[i]; value += "\n"; } } if(name.length() > 0) { ResultCsv result = new ResultCsv(name, value); csvValues.add(result); } return generateZipFile(csvValues); } catch(IOException ex) { logger.error("Failed generating a ZIP file", ex); return null; } } private SystemFile generateZipFile(List<ResultCsv> values) throws IOException { File tmpFile = File.createTempFile("result", "zip"); try (ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream( new FileOutputStream(tmpFile)))) { for (ResultCsv csv : values) { // add CSV files into ZIP archive String fileName = csv.getName(); if (fileName == null) { continue; } zip.putNextEntry(new ZipEntry(fileName)); byte[] value = csv.getValue().getBytes("SJIS"); zip.write(value, 0, value.length); } } // set ZIP file name return new SystemFile(tmpFile).attach("result.zip"); } }
Enter fullscreen mode Exit fullscreen mode
ResultCsv.java
<span>package</span> <span>jp.masanori.dto</span><span>;</span><span>public</span> <span>class</span> <span>ResultCsv</span> <span>{</span><span>private</span> <span>String</span> <span>name</span><span>;</span><span>private</span> <span>String</span> <span>value</span><span>;</span><span>public</span> <span>String</span> <span>getName</span><span>()</span> <span>{</span><span>return</span> <span>name</span><span>;</span><span>}</span><span>public</span> <span>String</span> <span>getValue</span><span>()</span> <span>{</span><span>return</span> <span>value</span><span>;</span><span>}</span><span>public</span> <span>ResultCsv</span><span>(</span><span>String</span> <span>name</span><span>,</span> <span>String</span> <span>value</span><span>)</span> <span>{</span><span>this</span><span>.</span><span>name</span> <span>=</span> <span>name</span><span>;</span><span>this</span><span>.</span><span>value</span> <span>=</span> <span>value</span><span>;</span><span>}</span><span>}</span><span>package</span> <span>jp.masanori.dto</span><span>;</span> <span>public</span> <span>class</span> <span>ResultCsv</span> <span>{</span> <span>private</span> <span>String</span> <span>name</span><span>;</span> <span>private</span> <span>String</span> <span>value</span><span>;</span> <span>public</span> <span>String</span> <span>getName</span><span>()</span> <span>{</span> <span>return</span> <span>name</span><span>;</span> <span>}</span> <span>public</span> <span>String</span> <span>getValue</span><span>()</span> <span>{</span> <span>return</span> <span>value</span><span>;</span> <span>}</span> <span>public</span> <span>ResultCsv</span><span>(</span><span>String</span> <span>name</span><span>,</span> <span>String</span> <span>value</span><span>)</span> <span>{</span> <span>this</span><span>.</span><span>name</span> <span>=</span> <span>name</span><span>;</span> <span>this</span><span>.</span><span>value</span> <span>=</span> <span>value</span><span>;</span> <span>}</span> <span>}</span>package jp.masanori.dto; public class ResultCsv { private String name; private String value; public String getName() { return name; } public String getValue() { return value; } public ResultCsv(String name, String value) { this.name = name; this.value = value; } }
Enter fullscreen mode Exit fullscreen mode
Returning a JSON file when ZIP file generation fails
<span>package</span> <span>jp.masanori</span><span>;</span><span>import</span> <span>java.io.File</span><span>;</span><span>import</span> <span>java.io.FileOutputStream</span><span>;</span><span>import</span> <span>java.io.IOException</span><span>;</span><span>import</span> <span>com.fasterxml.jackson.core.JsonProcessingException</span><span>;</span><span>import</span> <span>com.fasterxml.jackson.databind.ObjectMapper</span><span>;</span><span>import</span> <span>io.micronaut.http.server.types.files.SystemFile</span><span>;</span><span>public</span> <span>class</span> <span>ActionResult</span> <span>{</span><span>private</span> <span>boolean</span> <span>succeeded</span><span>;</span><span>private</span> <span>String</span> <span>errorMessage</span><span>;</span><span>public</span> <span>boolean</span> <span>isSucceeded</span><span>()</span> <span>{</span><span>return</span> <span>succeeded</span><span>;</span><span>}</span><span>public</span> <span>String</span> <span>getErrorMessage</span><span>()</span> <span>{</span><span>return</span> <span>errorMessage</span><span>;</span><span>}</span><span>public</span> <span>static</span> <span>ActionResult</span> <span>getSucceeded</span><span>()</span> <span>{</span><span>ActionResult</span> <span>result</span> <span>=</span> <span>new</span> <span>ActionResult</span><span>();</span><span>result</span><span>.</span><span>succeeded</span> <span>=</span> <span>true</span><span>;</span><span>return</span> <span>result</span><span>;</span><span>}</span><span>public</span> <span>static</span> <span>ActionResult</span> <span>getFailed</span><span>(</span><span>String</span> <span>errorMessage</span><span>)</span> <span>{</span><span>ActionResult</span> <span>result</span> <span>=</span> <span>new</span> <span>ActionResult</span><span>();</span><span>result</span><span>.</span><span>errorMessage</span> <span>=</span> <span>errorMessage</span><span>;</span><span>return</span> <span>result</span><span>;</span><span>}</span><span>public</span> <span>static</span> <span>String</span> <span>getFailedJson</span><span>(</span><span>String</span> <span>errorMessage</span><span>)</span> <span>throws</span> <span>JsonProcessingException</span> <span>{</span><span>ActionResult</span> <span>result</span> <span>=</span> <span>ActionResult</span><span>.</span><span>getFailed</span><span>(</span><span>errorMessage</span><span>);</span><span>ObjectMapper</span> <span>mapper</span> <span>=</span> <span>new</span> <span>ObjectMapper</span><span>();</span><span>return</span> <span>mapper</span><span>.</span><span>writeValueAsString</span><span>(</span><span>result</span><span>);</span><span>}</span><span>public</span> <span>static</span> <span>SystemFile</span> <span>getFailedJsonFile</span><span>(</span><span>String</span> <span>errorMessage</span><span>)</span> <span>throws</span> <span>IOException</span> <span>{</span><span>String</span> <span>resultJson</span> <span>=</span> <span>ActionResult</span><span>.</span><span>getFailedJson</span><span>(</span><span>errorMessage</span><span>);</span><span>File</span> <span>tmpFile</span> <span>=</span> <span>File</span><span>.</span><span>createTempFile</span><span>(</span><span>"result"</span><span>,</span> <span>"json"</span><span>);</span><span>try</span><span>(</span><span>FileOutputStream</span> <span>stream</span> <span>=</span> <span>new</span> <span>FileOutputStream</span><span>(</span><span>tmpFile</span><span>))</span> <span>{</span><span>stream</span><span>.</span><span>write</span><span>(</span><span>resultJson</span><span>.</span><span>getBytes</span><span>());</span><span>}</span><span>return</span> <span>new</span> <span>SystemFile</span><span>(</span><span>tmpFile</span><span>).</span><span>attach</span><span>(</span><span>"result.json"</span><span>);</span><span>}</span><span>}</span><span>package</span> <span>jp.masanori</span><span>;</span> <span>import</span> <span>java.io.File</span><span>;</span> <span>import</span> <span>java.io.FileOutputStream</span><span>;</span> <span>import</span> <span>java.io.IOException</span><span>;</span> <span>import</span> <span>com.fasterxml.jackson.core.JsonProcessingException</span><span>;</span> <span>import</span> <span>com.fasterxml.jackson.databind.ObjectMapper</span><span>;</span> <span>import</span> <span>io.micronaut.http.server.types.files.SystemFile</span><span>;</span> <span>public</span> <span>class</span> <span>ActionResult</span> <span>{</span> <span>private</span> <span>boolean</span> <span>succeeded</span><span>;</span> <span>private</span> <span>String</span> <span>errorMessage</span><span>;</span> <span>public</span> <span>boolean</span> <span>isSucceeded</span><span>()</span> <span>{</span> <span>return</span> <span>succeeded</span><span>;</span> <span>}</span> <span>public</span> <span>String</span> <span>getErrorMessage</span><span>()</span> <span>{</span> <span>return</span> <span>errorMessage</span><span>;</span> <span>}</span> <span>public</span> <span>static</span> <span>ActionResult</span> <span>getSucceeded</span><span>()</span> <span>{</span> <span>ActionResult</span> <span>result</span> <span>=</span> <span>new</span> <span>ActionResult</span><span>();</span> <span>result</span><span>.</span><span>succeeded</span> <span>=</span> <span>true</span><span>;</span> <span>return</span> <span>result</span><span>;</span> <span>}</span> <span>public</span> <span>static</span> <span>ActionResult</span> <span>getFailed</span><span>(</span><span>String</span> <span>errorMessage</span><span>)</span> <span>{</span> <span>ActionResult</span> <span>result</span> <span>=</span> <span>new</span> <span>ActionResult</span><span>();</span> <span>result</span><span>.</span><span>errorMessage</span> <span>=</span> <span>errorMessage</span><span>;</span> <span>return</span> <span>result</span><span>;</span> <span>}</span> <span>public</span> <span>static</span> <span>String</span> <span>getFailedJson</span><span>(</span><span>String</span> <span>errorMessage</span><span>)</span> <span>throws</span> <span>JsonProcessingException</span> <span>{</span> <span>ActionResult</span> <span>result</span> <span>=</span> <span>ActionResult</span><span>.</span><span>getFailed</span><span>(</span><span>errorMessage</span><span>);</span> <span>ObjectMapper</span> <span>mapper</span> <span>=</span> <span>new</span> <span>ObjectMapper</span><span>();</span> <span>return</span> <span>mapper</span><span>.</span><span>writeValueAsString</span><span>(</span><span>result</span><span>);</span> <span>}</span> <span>public</span> <span>static</span> <span>SystemFile</span> <span>getFailedJsonFile</span><span>(</span><span>String</span> <span>errorMessage</span><span>)</span> <span>throws</span> <span>IOException</span> <span>{</span> <span>String</span> <span>resultJson</span> <span>=</span> <span>ActionResult</span><span>.</span><span>getFailedJson</span><span>(</span><span>errorMessage</span><span>);</span> <span>File</span> <span>tmpFile</span> <span>=</span> <span>File</span><span>.</span><span>createTempFile</span><span>(</span><span>"result"</span><span>,</span> <span>"json"</span><span>);</span> <span>try</span><span>(</span><span>FileOutputStream</span> <span>stream</span> <span>=</span> <span>new</span> <span>FileOutputStream</span><span>(</span><span>tmpFile</span><span>))</span> <span>{</span> <span>stream</span><span>.</span><span>write</span><span>(</span><span>resultJson</span><span>.</span><span>getBytes</span><span>());</span> <span>}</span> <span>return</span> <span>new</span> <span>SystemFile</span><span>(</span><span>tmpFile</span><span>).</span><span>attach</span><span>(</span><span>"result.json"</span><span>);</span> <span>}</span> <span>}</span>package jp.masanori; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.micronaut.http.server.types.files.SystemFile; public class ActionResult { private boolean succeeded; private String errorMessage; public boolean isSucceeded() { return succeeded; } public String getErrorMessage() { return errorMessage; } public static ActionResult getSucceeded() { ActionResult result = new ActionResult(); result.succeeded = true; return result; } public static ActionResult getFailed(String errorMessage) { ActionResult result = new ActionResult(); result.errorMessage = errorMessage; return result; } public static String getFailedJson(String errorMessage) throws JsonProcessingException { ActionResult result = ActionResult.getFailed(errorMessage); ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(result); } public static SystemFile getFailedJsonFile(String errorMessage) throws IOException { String resultJson = ActionResult.getFailedJson(errorMessage); File tmpFile = File.createTempFile("result", "json"); try(FileOutputStream stream = new FileOutputStream(tmpFile)) { stream.write(resultJson.getBytes()); } return new SystemFile(tmpFile).attach("result.json"); } }
Enter fullscreen mode Exit fullscreen mode
FileController.java
<span>...</span><span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"zip"</span><span>)</span><span>public</span> <span>HttpResponse</span><span><</span><span>SystemFile</span><span>></span> <span>getZip</span><span>()</span> <span>{</span><span>SystemFile</span> <span>result</span> <span>=</span> <span>csvGen</span><span>.</span><span>generate</span><span>();</span><span>if</span><span>(</span><span>result</span> <span>==</span> <span>null</span><span>)</span> <span>{</span><span>try</span> <span>{</span><span>return</span> <span>HttpResponse</span><span>.</span><span>ok</span><span>(</span><span>ActionResult</span><span>.</span><span>getFailedJsonFile</span><span>(</span><span>"Failed generating a Zip file"</span><span>));</span><span>}</span> <span>catch</span><span>(</span><span>IOException</span> <span>ex</span><span>)</span> <span>{</span><span>return</span> <span>HttpResponse</span><span>.</span><span>serverError</span><span>();</span><span>}</span><span>}</span><span>return</span> <span>HttpResponse</span><span>.</span><span>ok</span><span>(</span><span>result</span><span>)</span><span>.</span><span>contentType</span><span>(</span><span>"application/zip"</span><span>);</span><span>}</span><span>...</span><span>...</span> <span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"zip"</span><span>)</span> <span>public</span> <span>HttpResponse</span><span><</span><span>SystemFile</span><span>></span> <span>getZip</span><span>()</span> <span>{</span> <span>SystemFile</span> <span>result</span> <span>=</span> <span>csvGen</span><span>.</span><span>generate</span><span>();</span> <span>if</span><span>(</span><span>result</span> <span>==</span> <span>null</span><span>)</span> <span>{</span> <span>try</span> <span>{</span> <span>return</span> <span>HttpResponse</span><span>.</span><span>ok</span><span>(</span><span>ActionResult</span><span>.</span><span>getFailedJsonFile</span><span>(</span><span>"Failed generating a Zip file"</span><span>));</span> <span>}</span> <span>catch</span><span>(</span><span>IOException</span> <span>ex</span><span>)</span> <span>{</span> <span>return</span> <span>HttpResponse</span><span>.</span><span>serverError</span><span>();</span> <span>}</span> <span>}</span> <span>return</span> <span>HttpResponse</span><span>.</span><span>ok</span><span>(</span><span>result</span><span>)</span> <span>.</span><span>contentType</span><span>(</span><span>"application/zip"</span><span>);</span> <span>}</span> <span>...</span>... @Get(uri="zip") public HttpResponse<SystemFile> getZip() { SystemFile result = csvGen.generate(); if(result == null) { try { return HttpResponse.ok(ActionResult.getFailedJsonFile("Failed generating a Zip file")); } catch(IOException ex) { return HttpResponse.serverError(); } } return HttpResponse.ok(result) .contentType("application/zip"); } ...
Enter fullscreen mode Exit fullscreen mode
原文链接:[Micronaut] Generating and downloading files as ZIP or JSON
© 版权声明
THE END
暂无评论内容