본문 바로가기
Java/TrobleShooting

java.io.IOException: Corrupt form data: premature ending

by Mecodata 2024. 11. 1.

현상

 

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()로 데이터를 추출하려는 상황에서 에러 발생

 

원인

Controller
insert.jsp

게시글 작성 페이지(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

댓글