@ 지금 구현하는 SNS 개인프로젝트에서 단일 파일 업로드를 구현해 보았다. 근데 찾아보다가 다중 파일업로드 도 할수있는 것을 알게 되었고, 나중에 활용해 보고자 정리해 보았습니다.
※ 기능(다중 파일 업로드)
- 이미지 파일 여러개 업로드가능
- 이미지 파일 선택후 재 선택 시 이전에 선택했던 파일 지워지지 않고 누적해서 업로드가능
※ JS(다중 파일 업로드) 관련 코드
let uploadFiles = [];
let files = null;
function getImageFiles(e) {
files = e.currentTarget.files;
[...files].forEach(file => {
uploadFiles.push(file);
});
// 파일 누적 관리
let w_input = document.querySelector('#w_input');
if (uploadFiles.length > 0) {
let dataTransfer = new DataTransfer();
// 파일을 DataTransfer에 추가
for (let i = 0; i < uploadFiles.length; i++) { dataTransfer.items.add(uploadFiles[i]); }
// DataTransfer에서 FileList-like 객체 생성
let uploader = dataTransfer.files;
// 파일 입력 요소에 설정
w_input.files = uploader;
}
}
const realUpload = document.querySelector('#w_m_file_input');
realUpload.addEventListener('change', getImageFiles);
※ 다중 파일 업로드 관련 (파일 누적관리 흐름)
- 실제 사용자가 업로드하는 input은 #w_m_file_input
- uploadFiles가 누적 파일을 관리하고 누적된 파일들을 #w_input이라는 input에 파일 정보들을 넣어놓는다.
- 그리고 form으로 controller에 가서 누적된 파일 정보를 가지고 있는 #w_input의 값을 가지고 코드를 돌리게 한다.
※ 다중 파일 업로드 관련 (파일 누적관리 하는 방법)
- 파일 정보를 담을 dataTransfer를 생성한다.
(원래 fileList를 사용하려고 했는데 인식이 안돼서 바꿨다.)
- 누적관리하고 있는 uploadFiles의 크기만큼 for문을 돌려 dataTransfer에 담는다.
- 변수를 만들어서 dataTransfer에 있는 file들의 데이터를 뽑아온다.
- controller에 보낼 input의 file에 넣는다.
※ 다중 파일 업로드 관련 (Controller 코드)
private static final String F_PATH = "C:/Users/user/Desktop/img/";
public String updateQna(@RequestParam(value="wFile", required = false) List<MultipartFile> imgFiles){
for(MultipartFile mf : imgFiles) {
if (mf.getOriginalFilename().equals("")){ break; }
String originalFileName = mf.getOriginalFilename();
String safeFileName = System.currentTimeMillis() + originalFileName;
String safeFile = F_PATH + safeFileName;
try {
mf.transferTo(new File(safeFile));
} catch (Exception e) {
e.printStackTrace();
}
}
}
※ 다중 파일 업로드 관련 (파일 업로드 흐름)
- input에서 파일 정보 가져오기
- 해당 파일 로컬 (서버) 에 저장하기
※ 다중 파일 업로드 관련 (파일 업로드 하는 방법)
- 위에 이미지 저장해 둘 path 주소를 정해둔다.
- @RequestPara(value="input [name]", required = false) List <MultipartFile> 변수명으로 매개변수를 받는다.
(이것이 input파일에 들어있는 파일데이터 받는 변수다.)
(List가 아닌 배열로 가져와도 된다.)
- forEach 돌려서. getOriginalFilename()을 써서 original파일명을 가져온다.
- 사용자들이 비슷한 시간에 이미지를 올리고 이미지명이 같을 수 있으니 이를 방지하기 위 해 System.currentTimeMillis() 를 사용해 밀리 초까지 잡아서 시간데이터를 original파일명 앞에 붙인다.
- 처음에 설정해 놓은 저장해 둘 path 주소와 같이 붙여서. transferTo(new File(해당파일))을 사용해 로컬(서버)에 저장한 다.
- 추후에 저장 path와 밀리초+originalFilename으로 이미지 가져오면 된다.
'국비교육' 카테고리의 다른 글
국비지원 79일 (attr ,porp,data 기타등등) (2) | 2023.12.23 |
---|---|
국비지원 78일차 (자바스크립트 - Json(ajax)) (1) | 2023.12.21 |
국비지원 76일차 (개인프로젝트 - 화면구성 스크롤구현) (0) | 2023.12.15 |
국비지원 75일차 [팀프로젝트 - 여행동행사이트(회원관련기능)] (0) | 2023.12.12 |
국비지원 74일차 (스프링 - 복습) (0) | 2023.11.07 |