最終更新日:190318原本2018-03-07 

Spring bootでCSVダウンロード

はじめに

SpringbootでCSVダウンロード機能を実装しようとするといくつか方法が見つかったのですがSpringで実行する仮想のTomcatではうごいたのに、実際にサーバに持って行ってTomcatに乗せてみると動かなかったりしたのでまとめてみました。

環境

  • apache Tomcat
  • Spring-Boot 1.5.9
  • Java 8

ソースコード

  • HTML, javaScript(ボタン押すだけです)
<form id="csvform" method="post">
    <button type="button" onClick="downloadCSV();"><img id="MORDAL_OKBUTTON_ICON"></img>確定</button>
</form>
<script>
function downloadCSV(){
    var date = new Date();
    var file_title = addzero(date.getFullYear())+addzero(date.getMonth()+1)+addzero(date.getDate())+addzero(date.getHours())+addzero(date.getMinutes())+addzero(date.getSeconds());
    url= "csvdownload";
    $('#csvform').attr('action', url);
    $('#csvform').attr('method', "GET");
    $('#csvform').submit();
}

function addzero(text){
    text = String(text);
    if(text.length==1){
        text = "0"+text;
    }
    return text;
}
</script>

  • java
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class CsvController {

    @RequestMapping(value = "/csvdownload/csv", method = RequestMethod.GET)
    public ResponseEntity<byte[]> download(
            @RequestParam("csvsearchname") String csvsearchname) throws IOException {
        HttpHeaders h = new HttpHeaders();
        h.add("Content-Type", "text/csv; charset=MS932");
        String  filename = csvsearchname;
        h.setContentDispositionFormData("filename", filename + ".csv");
        String CSVData = null;
        try{
            StringBuilder CSV = new StringBuilder();

            CSV.append("ssss");
            CSV.append("aaaa");
            CSVData =CSV.toString();

        }catch(Exception e){
            System.out.println(e);
            CSVData = null;
        }
        return new ResponseEntity<>(CSVData.getBytes("MS932"), h, HttpStatus.OK);
    }
}

終わりに

CSVダウンロード機能は様々なシステムに入っており、よく使われる機能ですが、
* 一度ファイルを生成して、ダウンロードさせる
* byteデータのまま返却する(今回の方法)
* etc
と様々な方法があると思うので、開発環境とやりたいことにあった方法を選択していきたいですね。