현상
Controller
@WebServlet("/main")
public class BoardController extends HttpServlet {
private static final long serialVersionUID = 1L;
private BoardDAO dao = new BoardDAO();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String saveDir = getServletContext().getRealPath("/upload");
int maxSize = 10 * 1024 * 1024;
String encoding = "UTF-8";
MultipartRequest multi = new MultipartRequest(request, saveDir, maxSize, encoding, new DefaultFileRenamePolicy());
String action = multi.getParameter("action");
String title = multi.getParameter("title");
String username = multi.getParameter("username");
String content = multi.getParameter("content");
String fileName = multi.getFilesystemName("uploadFile");
File file = multi.getFile("uploadFile");
request.setAttribute("title", title);
request.setAttribute("username", username);
request.setAttribute("content", content);
request.setAttribute("fileName", fileName);
request.setAttribute("file", file);
if("insert".equals(action)) {
request.getRequestDispatcher("/insert.jsp").forward(request, response);
} else {
doGet(request, response);
}
}
}
insert.jsp
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.File"%>
<%@page import="dao.BoardDAO"%>
<%@page import="dto.BoardDTO"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String saveDir = application.getRealPath("/upload");
int maxSize = 10 * 1024 * 1024;
String encoding = "UTF-8";
MultipartRequest multi = new MultipartRequest(request, saveDir, maxSize, encoding, new DefaultFileRenamePolicy());
String title = multi.getParameter("title");
String username = multi.getParameter("username");
String content = multi.getParameter("content");
String fileName = multi.getFilesystemName("uploadFile");
File file = multi.getFile("uploadFile");
byte[] fileData = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(fileData);
fis.close();
BoardDTO dto = new BoardDTO();
dto.setName(username);
dto.setTitle(title);
dto.setContent(content);
dto.setFileName(fileName);
dto.setFileData(fileData);
BoardDAO dao = new BoardDAO();
int result = dao.insertData(dto);
System.out.println("inser");
if (result > 0) {
response.sendRedirect("main.jsp");
} else {
%>
<script>
alert("게시글 추가에 실패했습니다. 다시 시도해 주세요.");
history.back();
</script>
<%
}
%>
게시글 작성 페이지(write.jsp)에서 <form action="main" method="post" enctype="multipart/form-data">를 통해 Controller로 파일 데이터를 전달할 때
Controller에서는 multipart/form-data 형식으로 인하여 doPost()에서 request.getParameter()로는 파라미터 값을 직접 읽어올 수 없어 request를 참조한 MultipartRequest 객체를 생성하여 MultipartRequest.getParameter()를 통해 필요한 데이터를 추출한 뒤
다시 request에 setAttribute()를 통해 데이터를 집어 넣고 request.getRequestDispatcher("/insert.jsp").forward(request, response)를 통해 insert.jsp로 이동한 뒤
insert.jsp에서 INSERT 쿼리를 수행하는 dao.insertData()를 실행하기 전에 MultipartRequest 객체를 또 다시 생성해서 getParameter()로 데이터를 추출하려는 상황에서 에러 발생
원인
게시글 작성 페이지(write.jsp)에서 Controller와 insert.jsp를 거쳐서 dao.insertData() 실행하려는 동안 MultipartRequest 객체가 두 번 생성되었던 것이 원인
해결방법
insert.jsp에서 MultipartRequest 객체를 생성할 필요 없이 바로 request.getAttribute()를 통해 데이터 추출하여 dao.insertData()를 실행
'Java > TrobleShooting' 카테고리의 다른 글
MultipartRequest, ServletFileUpload 혼용 문제 (0) | 2024.11.06 |
---|---|
페이징 시 값 고정 (0) | 2024.11.04 |
댓글