SpringBoot ファイルダウンロードについての例

package com.example.demo;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class DemoController {

/**
* ファイルデータテーブル(file_data)へアクセスするMapper
*/
@Autowired
private FileDataMapper fileDataMapper;

/**
* アカウントデータテーブル(account)へアクセスするMapper
*/
@Autowired
private AccountDataMapper accountDataMapper;

/**
* ファイルデータ一覧表示処理
* @param model Modelオブジェクト
* @return 一覧画面
*/
@RequestMapping("/")
public String index(Model model) {
//ファイルデータテーブル(file_data)を全件取得
List list = accountDataMapper.findAll();

// ファイル最大出力行数の設定
int outputMaxLine = 4;

// ファイル出力行数の取得
int outputLine = list.size();

// 既に出力行数
int nowOutPutLine = 0;

// ファイル名の設定
String fileName = "UserInfo";

// ファイル数の取得
long fileCnt = 0;

List fileList = new ArrayList();

FileData fileData = new FileData();

if (outputMaxLine < outputLine) {

fileCnt = outputLine / outputMaxLine;

fileData.setId(1);
fileData.setFileName(fileName);
fileList.add(fileData);

for (int i = 1; i <= fileCnt; i++) {
fileData = new FileData();
fileData.setId(i + 1);
fileData.setFileName(fileName + "_" + i);
fileList.add(fileData);
}

} else {

fileData.setId(1);
fileData.setFileName(fileName);
fileList.add(fileData);
}

model.addAttribute("fileDataList", fileList);

//一覧画面へ移動
return "list";
}

/**
* ファイルデータ登録画面への遷移処理
* @return ファイルデータ登録画面
*/
@RequestMapping("/to_add")
public String to_add() {
return "add";
}

/**
* ファイルデータ登録処理
* @param uploadFile アップロードファイル
* @param model Modelオブジェクト
* @return ファイルデータ一覧表示処理
*/
@RequestMapping("/add")
@Transactional(readOnly = false)
public String add(@RequestParam("upload_file") MultipartFile uploadFile, Model model) {
//最大値IDを取得
long maxId = fileDataMapper.getMaxId();

//追加するデータを作成
FileData fileData = new FileData();
fileData.setId(maxId + 1);
fileData.setFilePath(uploadFile.getOriginalFilename());
try {
fileData.setFileObj(uploadFile.getInputStream());
} catch (Exception e) {
System.err.println(e);
}
//1件追加
fileDataMapper.insert(fileData);

//一覧画面へ遷移
return index(model);
}

/**
* ファイルダウンロード処理
* @param id ID
* @param response HttpServletResponse
* @return 画面遷移先(nullを返す)
* @throws IOException
*/
@RequestMapping("/download")
public String download(@RequestParam("id") String id,HttpServletResponse response) throws IOException {

//ファイルデータテーブル(file_data)を全件取得
List list = accountDataMapper.findAll();

// ファイル最大出力行数の設定
int outputMaxLine = 4;

// ファイル出力行数の取得
int outputLine = list.size();

// 既に出力行数
int nowOutPutLine = 0;

// ファイル名の設定
String fileName = "UserInfo.csv";

// ファイル数の取得
long fileCnt = 0;

String filePath = System.getProperty("java.io.tmpdir");

//出力先を作成する
/*try {*/
FileWriter fw = new FileWriter(filePath + fileName, false);

PrintWriter pw = new PrintWriter(new BufferedWriter(fw));

for (int i = 0; i < outputLine; i++) {
if (outputMaxLine < outputLine) {

fileCnt = outputLine / outputMaxLine;

pw.print(list.get(i).getUserId());
pw.print(list.get(i).getUserName());
pw.println();

pw.close();
for (int j = 1; j <= fileCnt; i++) {
fw = new FileWriter(filePath + fileName + j, false);

pw = new PrintWriter(new BufferedWriter(fw));
pw.print(list.get(i).getUserId());
pw.print(list.get(i).getUserName());
pw.println();
pw.close();
}

} else {

pw.print(list.get(i).getUserId());
pw.print(list.get(i).getUserName());
pw.println();
}
}

pw.close();

//ファイルダウンロードの設定を実施
//ファイルの種類は指定しない
response.setContentType("application/octet-stream");
response.setHeader("Cache-Control", "private");
response.setHeader("Pragma", "");
response.setHeader("Content-Disposition",
"attachment;filename=\"" + getFileName(filePath + fileName) + "\"");

InputStream in = new FileInputStream(filePath + fileName);

ServletOutputStream out = response.getOutputStream();

int len = 0;

byte[] buf = new byte[1024];

while ((len = in.read(buf)) != -1) {

out.write(buf, 0, len);

}

in.close();

File file = new File(filePath + fileName);

file.delete();

//画面遷移先はnullを指定
return null;
}

/**
* ファイルパスからファイル名を取得する
* @param filePath ファイルパス
* @return ファイル名
*/
private String getFileName(String filePath) {
String fileName = "";
if (filePath != null && !"".equals(filePath)) {
try {
//ファイル名をUTF-8でエンコードして指定
fileName = URLEncoder.encode(new File(filePath).getName(), "UTF-8");
} catch (Exception e) {
System.err.println(e);
return "";
}
}
return fileName;
}

}