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