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;
}
}