- 작성한 게시글을 저장합니다
- 파일(이미지)를 선택했을 경우 파일도 업로드 합니다.
- 이전 파일 업로드시 cos라이브러리를 사용했는데 Servlet 버전 3.1 부터는 StandardServletMultipartResolver 를 사용합니다.
이미지 업로드 방법
1. enctype="multipart/form-data" 를 wirte.jsp 폼태그에 적용
2. 스프링에서는 StandardServletMultipartResolver 빈등록
현재 사용하고있는 버전이 3.1이 아니라서 라이브러리 추가 함 ㅠㅠ
pom.xml
<!-- 파일 업로드 라이브러리 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
servlet-context.xml
<!-- 파일 업로드 -->
<beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value="utf-8"></beans:property>
<!-- 1024 * 1024 * 10 bytes 10MB -->
<beans:property name="maxUploadSize" value="104857560"></beans:property>
<!-- 1024 * 1024 * 2 bytes 2MB -->
<beans:property name="maxUploadSizePerFile"
value="2097152"></beans:property>
<beans:property name="uploadTempDir"
value="file:/C:/java/upload"></beans:property>
<beans:property name="maxInMemorySize" value="10485756"></beans:property>
</beans:bean>
파일 위치 c-> java-> upload폴더 지정
|
https://blog.naver.com/drv982/222911772658
.
write.jsp
enctype="multipart/form-data" 를 wirte.jsp 폼태그에 적용
method는 post 라서 그 부분 지우고 입력함
BoardVO
MultipartFile 추가
write.jsp
첨부이미지 path 수정
DB에는 파일의 이름만 저장하기로함( 파일의 경로)
BoardController
write 수정
@GetMapping("/write")
public String write(@ModelAttribute("writeBean") BoardVO writeBean,@RequestParam("info_idx") int info_idx ) {
writeBean.setBoard_idx(info_idx);
return "board/write";
}
board_idx도 같이 전달되게함
write_pro 에서 DB를 불러오기위해서
BoardServiec 생성 - 나중에 수정할거임
package com.demo.service;
import org.springframework.stereotype.Service;
import com.demo.domain.BoardVO;
@Service
public class BoardService {
public void addContentInfo(BoardVO writeBean) {
}
}
BoardController
@PostMapping("/write_pro")
public String write_pro(@Valid @ModelAttribute("writeBean") BoardVO writeBean, BindingResult result ) {
if(result.hasErrors()) {
return "board/write";
}
//DB에 새 게시글 저장
boardService.addContentInfo(writeBean);
return "board/write_success";
}
BoardService에서 자료를 잘 가지고 있는지 테스트 하기
HomeController 에서 현재 실행되고 있는 주소를 확인한다.
package com.demo.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home(HttpServletRequest request) {
//실제 서버 실행 시 프로젝트 주소를 출력한다.
System.out.println(request.getRealPath("/"));
return "index"; ///WEB-INF/views/가 생략되어있는거임
}
}
실행하면 콘솔에 아래와 같은 주소가 입력된다.
C:\Java\workspace-legacy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MiniProject
콘솔을 확인해 보면 알 수 있듯이 톰캣서버에서는 실행을 할 때 각 프로젝트 폴더에서 실행하는 것이 아니라
이클립스 서버는 .metadata에서 실행됨
(아래의 프로젝트 폴더들을 압축하여 metadata폴더로 들고가서 사용)
현재 resources폴더에 upload 폴더를 만든 상태고
만약에 여기에 이미를 직접적으로 넣는다고 해서 서버에 바로 저장되는것이 아님
그래서 업로드 경로를 위와 같이
C:\Java\workspace-legacy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MiniProject의
resources -> upload에 넣어줘야함
BoardService
package com.demo.service;
import java.io.File;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.demo.domain.BoardVO;
@Service
public class BoardService {
private String path_upload = "C:\\Java\\workspace-legacy\\.metadata\\.plugins\\org.eclipse.wst.server.core\\" + ""
+ "tmp0\\wtpwebapps\\MiniProject\\resources\\upload";
// 서버로 업로드 된 파일을 업로드 폴더에 저장하고 파일의 이름을 리턴하는 메소드
private String saveUploadFile(MultipartFile upload_file) {
// 현재 시간(밀리세컨드)을 이용해서 파일의 이름이 중복되지 않게 설정
String file_name = System.currentTimeMillis() + "_" + upload_file.getOriginalFilename();
try {
// 파일에 경로(위치)로 파일을 저장한다.
upload_file.transferTo(new File(path_upload + "/" + file_name));
} catch (Exception e) {
e.printStackTrace();
}
return file_name; // 실제로 저장한 파일의 이름이 리턴된다.
}
public void addContentInfo(BoardVO writeBean) {
MultipartFile upload_file = writeBean.getUpload_file();
//파일의 사이즈가 0보다 클 경우(파일이 있을 경우) 에만 저장함
if(upload_file.getSize() > 0) {
String file_name = saveUploadFile(upload_file);
//실제 파일을 저장 후 파일이름을 content_file에 저장
writeBean.setContent_file(file_name);
}
}
}
path_upload 변수를 사용해서 주소를 담음
테스트 실행
실제 업로드 폴더에 저장이 되는지 확인한다.
그리고 주소가 너무 기니까, 프로퍼티에 저장해서 다른 곳에서도 쉽게 접근할 수 있도록 만든다.
WEB-INF 아래에 폴더 생성
option.properties 파일 생성
path.upload = C:/Java/workspace-legacy/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/MiniProject/resources/upload
역슬래시 두 개를 일반 슬래시로 바꿈
BoardService
@PropertySource("/WEB-INF/properties/option.properties") 를 사용해서 작성한 프로퍼티 주소를 입력하고
@Value를 이용해서 사용가능함
DB저장
BoardMapper.xml
<insert id="newBoard" parameterType="com.demo.domain.BoardVO">
INSERT INTO
board(title,content,content_file, writer_idx,info_idx)
VALUES( #{title},#{content},#{content_file},#{writer_idx},#{info_idx}
)
</insert>
package com.demo.dao;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.demo.domain.BoardVO;
@Repository
public class BoardDAO {
@Autowired
private SqlSessionTemplate sqlTemplate;
//글 작성
public void addContentInfo(BoardVO writeBean) {
sqlTemplate.insert("board.newBoard", writeBean);
}
}
BoardService
package com.demo.service;
import java.io.File;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.demo.dao.BoardDAO;
import com.demo.domain.BoardVO;
import com.demo.domain.LoginUser;
@Service
@PropertySource("/WEB-INF/properties/option.properties")
public class BoardService {
@Value("${path.upload}")
private String path_upload;
//로그인 정보를 담고있는 객체 이름으로 주입
@Resource(name = "sessionUser")
private LoginUser sessionUser;
@Autowired
private BoardDAO boardDAO;
// 서버로 업로드 된 파일을 업로드 폴더에 저장하고 파일의 이름을 리턴하는 메소드
private String saveUploadFile(MultipartFile upload_file) {
// 현재 시간(밀리세컨드)을 이용해서 파일의 이름이 중복되지 않게 설정
String file_name = System.currentTimeMillis() + "_" + upload_file.getOriginalFilename();
try {
// 파일에 경로(위치)로 파일을 저장한다.
upload_file.transferTo(new File(path_upload + "/" + file_name));
} catch (Exception e) {
e.printStackTrace();
}
return file_name; // 실제로 저장한 파일의 이름이 리턴된다.
}
//글 작성
public void addContentInfo(BoardVO writeBean) {
MultipartFile upload_file = writeBean.getUpload_file();
//파일의 사이즈가 0보다 클 경우(파일이 있을 경우) 에만 저장함
if(upload_file.getSize() > 0) {
String file_name = saveUploadFile(upload_file);
//실제 파일을 저장 후 파일이름을 content_file에 저장
writeBean.setContent_file(file_name);
}
//글쓴이를 세션로그인에서 가져와서 추가
writeBean.setWriter_idx(sessionUser.getUser_idx());
//DB에 저장
boardDAO.addContentInfo(writeBean);
}
}
write_success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="root" value="${pageContext.request.contextPath}" />
<script>
alert('저장 되었습니다')
location.href = "${root}/board/read"
</script>
'BACKEND > Spring' 카테고리의 다른 글
게시판 만들기 2- 글 상세보기 페이지 (1) | 2023.11.01 |
---|---|
게시판 만들기 2 -게시판 제목 및 게시글 목록 (1) | 2023.11.01 |
게시판 만들기 2 - 글 작성하기(유효성검사) (0) | 2023.10.31 |
게시판 만들기 2 - 글 작성하기 (get) (0) | 2023.10.31 |
게시판 만들기 2 - 정보 수정 하기 (0) | 2023.10.31 |