Spring/Spring
day72) 파일 업로드
code_learner
2022. 4. 12. 21:41
[VIEW]
파일업로드를 수행 할 수 있는 form생성
<form action="insertBoard.do" method="post" enctype="multipart/form-data">
<!--enctype="multipart/form-data : 정상적으로 전송되기 위한 인코딩설정-->
<table border="1">
<tr>
<td>제목</td>
<td><input type="text" name="title"></td>
</tr>
<tr>
<td>작성자</td>
<td><input type="text" name="writer"
value="${member.name}" readonly></td>
</tr>
<tr>
<td>내용</td>
<td><input type="text" name="content"></td>
</tr>
<tr>
<td>파일 업로드</td>
<td><input type="file" name="uploadFile"></td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit" value="글 작성"></td>
</tr>
</table>
</form>
[CONTROLLER]
1)VIEW에서 전송한 데이터를 받는 Command객체는 기존의 데이터를 String으로 받았다.
-> 파일을 받기 위해서 스프링 프레임워크에서 제공하는 MultipartFile 타입으로 인코딩된 데이터를 관리해야한다.
-BoardVO
//파일 저장 타입
private MultipartFile uploadFile;
//사진 저장 경로
private String filename;
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public MultipartFile getUploadFile() {
return uploadFile;
}
public void setUploadFile(MultipartFile uploadFile) {
this.uploadFile = uploadFile;
}
2)MultipartFile 타입의 등장으로 자원(라이브러리)이 필요함
-pom.xml
<!-- 파일업로드 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
3) MultipartFile 타입을 다루기 위한 Resolver가 필요함
-> DS - servlet.xml에 파일업로드 설정을 추가해야함
*Resolver류들은 이름이 정해져있는 경우가 대부분이여서 함부로 변경하면 안된다
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- value="-1" = 파일크기 제한x -->
<property name="maxUploadSize" value="-1"></property>
</bean>
-COMMAND객체가 하는 일
[1] new VO객체
[2] req.getParam("uploadFile")
[★] MultipartFile uploadFile = new MultipartFile();
-> 인자에 해당하는 것을 new 해줘야 한다.
-> 스프링 컨테이너가 수행
[3] vo.setUploadFile(☆)->들어갈 인자가 String이 아니기 때문에
4)로직구현
-BoardController
@RequestMapping(value="/insertBoard.do")
public String insertBoard(BoardVO vo) throws IllegalStateException, IOException {
// 파일업로드 로직
MultipartFile uploadFile=vo.getUploadFile();
if(!uploadFile.isEmpty()) {
//!=null을 하면 이전에 했던 것에 따른 정보를 줄 수 있기 때문에 isEmpty를 사용함
String name=uploadFile.getOriginalFilename();
System.out.println("파일명: "+name);
uploadFile.transferTo(new File
("C:\\SEO\\workspace3\\day71\\src\\main\\webapp\\images\\"+name));
//transferTo: 경로+다루고 있는파일을 인자로 넘겨주면 해당 경로로 파일을 업로드 해줌
}
else {
}
boardService.insertBoard(vo);
return "redirect:main.do";
}
[MODEL]
-sql(board table)
create table board(
bid int primary key,
title varchar(50),
writer varchar(30),
content varchar(100),
filename varchar(500)
);
-BoardDAO
// insert로직의 컬럼에 사진경로도 추가
private final String BOARD_INSERT="insert into board values((select nvl(max(bid),0)+1 from board),?,?,?,?)";
public void insertBoard(BoardVO vo) {
System.out.println("insertBoard() 호출됨");
jdbcTemplate.update(BOARD_INSERT, vo.getTitle(),vo.getWriter(),vo.getContent(),vo.getFilename());
}
class BoardRowMapper implements RowMapper<BoardVO> {
@Override
public BoardVO mapRow(ResultSet rs, int rowNum) throws SQLException {
BoardVO data=new BoardVO();
data.setBid(rs.getInt("bid"));
data.setContent(rs.getString("content"));
data.setTitle(rs.getString("title"));
data.setWriter(rs.getString("writer"));
data.setFilename(rs.getString("filename")); //사진경로 추가
return data;
}
[VIEW-확인하기]
<img alt="파일업로드 실습" src="images/${data.filename}">