end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

org.seasar.struts.util.ResponseUtil for java にある download() の spring版

import org.seasar.struts.util.ResponseUtil;

is = new FileInputStream(file);
ResponseUtil.download(getDecodeFileName(fileName), is, (int)file.length());

seasar2 では、上記のように、ResponseUtil.download() でファイルダウンロードできましたが spring では、多分、以下。

ただし、excel のダウンロードに限っては、 apache poi に付属する AbstractXlsxView を利用する方法もあります。

package jp.end0tknr;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {

    @Autowired
    XlsxOutService xlsxOutService;

    @RequestMapping(value="/index6")
    public void index6(
            HttpServletRequest request,
            HttpServletResponse response,
            Model model) {
        System.out.println("START index6");

        Workbook workBook = xlsxOutService.outXlsx();

        FileOutputStream out;
        try {
            workBook.write( new FileOutputStream("./TEXT_POI.XLSX") );
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return;
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        try {
            InputStream inputStream = new FileInputStream("./TEXT_POI.XLSX");
            OutputStream outputStream = response.getOutputStream();
            byte[] fileByteArray = IOUtils.toByteArray(inputStream);

            response.setContentType("application/octet-stream");
            response.setHeader(
                    "Content-Disposition",
                    "attachment; filename=TEXT_POI.XLSX");
            response.setContentLength(fileByteArray.length);

            outputStream.write(fileByteArray);
            outputStream.flush();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return;
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
    }
}

尚、上記では、IOUtils.toByteArray() を使用していますので、 pom.xml へ commons-io を追加してください。

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.9.0</version>
</dependency>