csv의 형식은 단순히 구분자 없이 개행처리만 되어 있다고 가정했다.
먼저 엑셀에 테스트용 .csv 파일을 2개 정도 만든다.
jsp에서 form을 만들어서 여러 개의 파일을 선택받도록 한다.
<form ~ enctype="multipart/form-data">
...
<input name="attach" type="file" multiple>
<button type="submit">upload</button>
</form>
controller에서는 Multipart[]로 받는다.
인터넷을 보니 file객체들이 안 올 경우 @RequestParam 붙이라는 경우도 있었다.
처음 시도할 때 수정된 부트스트랩을 가져다 썼었는데 파일 정보가 안 들어왔었다. file.getOriginalName() 등을 통해서 파일 정보를 확인하고 제대로 들어오는 지 체크가 필요하다.
이제 받아온 MultipartFile[]을 BufferReader로 한 줄씩 읽는다.
readCsv() 메서드로 처리했다.
private List<String> readCsv(MultipartFile[] attach) throws IOException {
List<String> csvList = new ArrayList<String>();
for (MultipartFile file : attach) {
try {
// FileReader reader = new FileReader("C:\\Users\\jinvi\\Downloads\\csvtest.csv"); // 이슈 : fileName을 못 가져온다.
BufferedReader br = new BufferedReader(new InputStreamReader(file.getInputStream()));
String line;
while ((line = br.readLine()) != null)
csvList.add(line);
br.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return csvList;
}
파일을 받아오는 게 자꾸 실패해서 처음엔 컴퓨터 내부 csv 파일 경로를 복사해서 FileReader() 객체로 하드코딩해서 테스트를 먼저 했다.
FileReader() 또는 MultipartFile의 .getInputStream()을 이용할 수 있다.
다음으로 선택한 파일이 csv 형식인지 확인하는 작업이 필요하다.
img를 선택해서 한줄씩 읽기라도 하면 디비에 들어가는 데 오류가 생긴다(데이터 길이, 애초에 들어가면 안되는 값임)
public static boolean isCSVFile(String fileName) {
String CSV_FILE_REGEX = "^.+\\.csv$";
Pattern pattern = Pattern.compile(CSV_FILE_REGEX, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(fileName);
return matcher.matches();
}
최종적으로 controller에서 지정한 /read/csv 경로에서 호출한다.
@PostMapping("/read/csv")
public void addCoupList(@RequestParam MultipartFile[] attach, @RequestParam String idOpt, HttpServletResponse response) throws IOException {
for (MultipartFile file : attach) {
if (!isCSVFile(file.getOriginalFilename())) {
ScriptUT.moveBack(response, "csv 형식이 아닌 파일이 존재합니다.");
return;
}
}
try {
List<String> csvList = readCsv(attach);
if (csvList == null) throw new Error("csv is null or reading error");
for (String coupon : csvList) {
if (service.add(idOpt, coupon) != 1) throw new Error("csv coupon insert error");
}
ScriptUT.moveRedirect(response, "쿠폰 추가 완료", "/modu/coupon/list?opt_id=" + idOpt);
} catch (Exception e) {
e.printStackTrace();
ScriptUT.moveBack(response, "쿠폰 추가 실패");
}
}
쿠폰 ID는 난수를 생성해서 저장하고, 옵션아이디와 쿠폰 코드를 같이 받아서 저장했다.
최종적으로 쿠폰 코드 컬럼에 한줄씩 저장된 것을 확인할 수 있다.