JSP/이론

파일업로드//enctype

SEOKIHOUSE 2023. 6. 19. 16:53

준비물


  • enctype 

<form> 태그의 enctype 속성은 폼 데이터(form data)가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시

이 속성은 <form> 요소의 method 속성값이 “post”인 경우에만 사용가능!!

http://www.tcpschool.com/html-tag-attrs/form-enctype <<참고

application/x-www-form-urlencoded 기본값으로, 모든 문자들은 서버로 보내기 전에 인코딩됨을 명시
multipart/form-data 모든 문자를 인코딩하지 않음을 명시함.
이 방식은 <form> 요소가 파일이나 이미지를 서버로 전송할 때 주로 사용
text/plain 공백 문자(space)는 "+" 기호로 변환하지만, 나머지 문자는 모두 인코딩되지 않음을 명시

  1. MultipartRequest 생성자의 인자:
    • request: post 방식으로 전송된 데이터를 담고 있는 객체입니다.
    • application.getRealPath("/files"): 업로드된 파일을 저장할 경로를 지정합니다. /files 경로는 웹 애플리케이션의 루트 경로에서의 상대 경로입니다.
    • 100*1024*1024: 업로드 파일의 최대 허용 크기를 지정합니다. 이 경우에는 100MB로 설정되어 있습니다.
    • "utf-8": 업로드된 파일의 인코딩을 지정합니다.
    • new DefaultFileRenamePolicy(): 동일한 파일명이 이미 존재할 경우에 대한 처리 방법을 지정합니다. 기본 정책은 중복된 파일명에 번호를 붙여 구분합니다.
  2. getFile("upload"): 업로드된 파일의 정보를 얻기 위해 MultipartRequest 객체에서 upload라는 이름으로 전송된 파일을 얻습니다.

servlet vs jsp 파일경로 지정하는 방법

 


↑↑↑두개 동일하다고 한다 ㅇㅋ?ㅇㅋ↑↑↑


  • 1)파일업로드하는거로 넘기는거면 multipartRequest 객체를 사용해서 파라미터값을 받아야한다


  • 1-1)기존에 하던거처럼 받으면 null이뜬다..


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload Form</title>
</head>
<body>
	<h3>업로드할 파일을 선택하세요</h3>
	<form action="01_fileupload.jsp" method="post" enctype="multipart/form-data">
		<input type="file" name="upload"><br>
		<input type="submit" value="파일업로드">
	</form>
</body>
</html>
<%@page import="java.io.File"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		MultipartRequest m = new MultipartRequest(
				request,//post방식으로 전송된 데이터를 담는 객체
				application.getRealPath("/files"), //파일저장경로
				100*1024*1024, //100MB
				"utf-8",
				new DefaultFileRenamePolicy() //동일 파일명 처리방법
				);
	
		File file = m.getFile("upload"); //파일객체 얻기
		
		if(file == null) {
			out.print("파일 업로듀 오류");
		}else {
			out.print("file name : " + file.getName() +"<br>");
			out.print("file size: " + file.length() +"<br>");
			
		}
	%>
</body>
</html>

1)상품등록하는거로 연습해보gi

1)jsp로만해보기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload Form</title>
</head>
<body>
	<h3>업로드할 파일을 선택하세요</h3>
	<form action="01_fileupload.jsp" method="post" enctype="multipart/form-data">
		상품명 <input type="text" name="name"><br>
		상품설명 <input type="text" name="content"><br>
		<input type="file" name="upload"><br>
		<input type="submit" value="파일업로드">
	</form>
</body>
</html>
<%@page import="java.io.File"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		MultipartRequest m = new MultipartRequest(
				request,//post방식으로 전송된 데이터를 담는 객체
				application.getRealPath("/files"), //파일저장경로
				100*1024*1024, //100MB
				"utf-8",
				new DefaultFileRenamePolicy() //동일 파일명 처리방법
				);
		
		//같이 보내는 경우 m으로 getparameter로 하자
		String name = m.getParameter("name");
		String content = m.getParameter("content");
		
		File file = m.getFile("upload"); //파일객체 얻기
		String filename ="";
		if(file == null) {
			out.print("파일 업로듀 오류");
		}else {
			out.print("file name : " + file.getName() +"<br>");
			out.print("file size: " + file.length() +"<br>");
			filename = file.getName();
		}
		
	%>
</body>
	<div>
		상품명: <%=name %><br>
		상품설명: <%=content %><br>
		<img alt="" src="files/<%=filename %>">
	</div>
</html>

2)서블렛으로 하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="fileuploadServlet" method="post" enctype="multipart/form-data">
		상품명 <input type="text" name="name"><br>
		상품설명 <input type="text" name="content"><br>
		<input type="file" name="upload">
		<input type="submit" value="파일업로드">
	</form>
</body>
</html>
package servlet;

import java.io.File;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

@WebServlet("/fileuploadServlet")
public class fileuploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String saveDirectory = getServletContext().getRealPath("/files");
        int maxFileSize = 100 * 1024 * 1024; // 100MB
        String encoding = "UTF-8";
        
        MultipartRequest m = new MultipartRequest(
            request,
            saveDirectory,
            maxFileSize,
            encoding,
            new DefaultFileRenamePolicy()
        );
        
        File file = m.getFile("upload");
        String name = m.getParameter("name");
        String content = m.getParameter("content");
        String filename ="";
        
        if(file != null) {
        	filename = file.getName();
        }
        
        request.setAttribute("name", name);
		request.setAttribute("content", content);
		request.setAttribute("filename", filename);	
		request.getRequestDispatcher("01_sangpoomupload.jsp").forward(request, response);
	}

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>
		상품명: ${name }<br>
		상품설명: ${content }<br>
		<img alt="" src="files/${filename }">
	</div>
</body>
</html>