파일 업로드를 위한 뷰(설명 생략)
<div class="form-group">
<div class="col-md-2 text-right">
<label for="files" class="control-label">파일1</label>
</div>
<div class="col-md-8">
<input type="file" class="form-control input-lg" name="files"
id="files" placeholder="파일선택" multiple="multiple">
</div>
</div>
<div class="form-group">
<div class="col-md-2 text-right">
<label for="title" class="control-label">파일2</label>
</div>
<div class="col-md-8">
<input type="file" class="form-control input-lg" name="files"
id="title" placeholder="파일선택">
</div>
</div>
<div class="form-group">
<div class="col-md-2 text-right">
<label for="files" class="control-label">파일3</label>
</div>
<div class="col-md-8">
<input type="file" class="form-control input-lg" name="files"
id="files" placeholder="파일선택">
</div>
</div>
<div class="form-group">
<div class="col-md-2 text-right">
<label for="files" class="control-label">파일4</label>
</div>
<div class="col-md-8">
<input type="file" class="form-control input-lg" name="files"
id="files" placeholder="파일선택">
</div>
</div>
<div class="form-group">
<div class="col-md-2 text-right">
<label for="title" class="control-label">파일5</label>
</div>
<div class="col-md-8">
<input type="file" class="form-control input-lg" name="files"
id="title" placeholder="파일선택">
</div>
</div>
테이블
create table deptimage_file(
deptno varchar(12),
originalFilename varchar(100),
storeFilename varchar(100) ,
deptimageFileno varchar(20)
);
라이브러리
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
설정파일에 추가할 내용
<beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="4000000"/>
</beans:bean>
BoardFileDTO
package com.multi.erp.board;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BoardFileDTO {
private String board_no;
private String originalFilename;
private String storeFilename;
private String boardFileno;
}
테이블의 컬럼수만큼 맴버변수를 선언하며 업로드되는 파일의 값을 사용할수있게 DTO를 만들어 줘야한다.
이 클래스는 Lombok라이브러리의 어노테이션들을 사용하고 있다.
"@Data" : 이 어노테이션은 클래스에 getter,setter,eqyals,hashCode,toString 메소드를 자동으로 추가한다.
이는 보일러플레이트 코드를 줄이고 가독성을 향상시키는데 도움이된다.
"@AllArgsConstructor" : 이 어노테이션은 모든 필드 값을 인자로 받는 생성자를 만든다. 이를 통해 객체 생성과 동시에 모든 필드 값을 설정할 수 있다.
"@NoArgsConstructor" : 이 어노테이션은 인자를 받지 안는 기본 생성자를 만든다 이를 통해 필드 값을 나중에 설정할 수 있는 객체를 생성할 수 있다.
FileUploadLoginService 코드 리뷰
package com.multi.erp.board;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Service
public class FileUploadLogicService {
//파일 업로드를 수행하는 메소드 -업로드된 파일의 정보를 BoardFileDTO로 변환해서 리턴
//여러 개인 경우 BoardFileDTO를 List
//파일업로드를 수행하는 로직 //파일명 중복되지 않도록 관리하기 위해 중복되지 않는 키값으로 자동생성되게..(UUID)
public List<BoardFileDTO> uploadFiles(List<MultipartFile> multipartFiles, String path) throws IllegalStateException, IOException {
List<BoardFileDTO> filedtolist = new ArrayList<BoardFileDTO>();
int count = 1;
for(MultipartFile multipartFile : multipartFiles) {
//업로드를 하는 경우 원본파일명과 서버에서 식별할 수 있는 실제 서버에 저장되는 파일명 두개를 관리
//클라이언트가 업로드한 원본파일명
if(!multipartFile.isEmpty()) {
String orignalFilename = multipartFile.getOriginalFilename();
//서버에서 식별할 수 있도록 파일명은 변경
String storeFilename = createStoreFilname(orignalFilename);
//파일명과 path를 이용해서 실제 File객체를 만든 후 업로드하기
//xxxxxx/WEB-INF/upload + / + 파일명
multipartFile.transferTo(new File(path + File.separator + storeFilename));
System.out.println("원본파일명: " + orignalFilename);
System.out.println("저장파일명: " + storeFilename);
filedtolist.add(new BoardFileDTO(null, orignalFilename,storeFilename, count+""));
count++;
}
}
return filedtolist;
}
//UUID를 이용해서 파일명은 변경해서 리턴하는 메소드
private String createStoreFilname(String originalFilename) {
int pos = originalFilename.lastIndexOf(".");
String ext = originalFilename.substring(pos + 1);//시작index만 지정하면 시작index부터 끝까지 문자열 추출
String uuid = UUID.randomUUID().toString();
return uuid + "." + ext;
}
}
"@Service" : 이 어노테이션은 이클래스가 Spring에서 관리하는 Service계층의 Bean임을 나타낸다
이 클래스는 비즈니스로직을 처리하며 컨트로러와 DAO 사이에 동작한다.
"uploadFiles(List<multipartFile> multipartFiles,String path)" : 이 메소드는 MultipartFile객체의 리스트와 파일이 저장될 경로를 받아 파일을 업로드한다 각 파일에 대해 원래의 파일 이름을 가져오고 새로운 고유한 파일 이름을 생선한 후 해당 파일을 지정된 경로에 저장한다 이 메소드는 모든 업로드된 파일의 정보를 담은 BoardFileDTO 객체의 리스트를 반환한다.
"createStoreFilname(String originalFilename)" : 이 메소드는 원본파일의 이름을 받아 UUID를 이용하여 새로운 고유한 파일 이름을 생성한다 이를통해 파일 이름의 중복을 방지한다.
"UUID.randomUUID().toString()" : 이 메소드는 랜덤한 UUID를 생성한다 UUID는 전 세계적으로 고유한 ID를 보장하기 떄문에 파일 이름에 사용하면 파일 이름의 중복을 필할 수 있다.
"miltipartFile.transferTo(new file(path + File.separator + storeFilename))" : 이 줄은 MultipartFile객체를 실제파일 시스템에 저장한다.
"BoardFileDTO" : 이클래스는 파일 정보를 저장하기 위한 DTO다 이코드에서는 원본 파일명,저장파일명 등의 정보를 포함.
최종요약: 사용자가 업로드한 파일을 서버에 안전하게 저장하고 각 파일에 대한 정보를 관리하는 방법을 배울수있다.
파일 시스템에 직접 접근하여 작업을 수행.
'코드리뷰' 카테고리의 다른 글
MyBatis, Spring (com.multi.erp.member) (0) | 2023.05.13 |
---|---|
MyBatis,Spring(com.multi.erp.board) (2) | 2023.05.13 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!