[JSP] :: FILE UPLOAD

[JSP] :: FILE UPLOAD

​# FILEUPLOADACTION.JAVA

package action; import java.io.File; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; 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; /** * Servlet implementation class FileUploadAction */ @WebServlet("/upload.do") public class FileUploadAction extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response) */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // FORM태그에서 MULTIFILE을 사용할 경우 파일이 전송되므로 SETCHARACTERENCODING을 사용하지 않는다. /* 절대경로와 상대경로의 차이 절대 경로 컴퓨터 하드 드라이브인 C나 D로부터 시작해서 단계씩 실제 하위 폴더로 접근하는 방식 특정 폴더로 접근했을 때, 내PC > 로컬 C드라이브 > 폴더가 위치한 실제 주소값을 뜻한다. 상대 경로 기본적으로 비교할 두개의 위치가 있어야한다. 현재 파일의 위치에서 나머지 파일의 위치가 어디인지 파악하는 주소 AJAX에서 JS파일을 ../등의 방식으로 검색한 주소를 뜻한다. (1) / : 최상위 경로 (2) ./ : 현재 디렉토리(폴더) (3) ../ : 상위 디렉토리 JSP, SPRING등 프로그램에서 경로 절대 경로 : 실제적인 경로 상대 경로 : 프로젝트에서 WEBCONTENT에 들어가는 경로 주의사항 - 집어넣는 절대 경로에는 반드시 경로상의 파일이 있어야한다. (예시, UPLOAD) - 절대경로(페이지상으로 사용자가)로 넣는 경우 절대 경로상의 위치에는 파일이 들어가지만 WEBCONTENT(상대경로)에는 들어가지 않는다. - 상대경로(WEBCONTENT)에 사진을 집어넣으면 절대 경로에도 사진이 들어간다. 결론 클라이언트(사용자)가 저장하는 이미지는 절대경로의 위치에 저장해야하고 개발자가 개발에 사용하는 이미지는 상대경로(WEBCONTENT)에 넣어두고 사용한다. */ /* 서버 (개발자 PC)의 어느 폴더에 저장할지에대한 경로 지정 GETREALPATH를 통해서 클라이언트에서 업로드로 절대 경로의 위치에 파일을 올리고 WEBCONTENT에서 접근하는 상대경로로도 업로드 가능하도록 지정 [참고] :: WEB_PATH에 작성한 UPLOAD파일은 절대 경로의 위치에 같은 폴더가 있어야한다. */ // 상대 경로 String web_path = "/upload/"; // 현재 웹 어플리케이션을 관리하는 객체인 SERVLETCONTEXT 객체 생성 ServletContext application = request.getServletContext(); // 절대 경로 // GETREALPATH : 프로젝트 상의 상대 경로를 절대경로로 변환 String path = application.getRealPath(web_path); System.out.println("경로 : "+path); // 파일의 최대 업로드 용량 (높이*너비*최대용량) // 파일의 최대 용량은 서버가 허락하는 한 더 크게 잡을 수 있다. // BUFFRED STREAM을 사용하므로 업로드할 때만 일시적으로 공간을 잡는 것으로 최대치만 100MB이며 1MB의 경우에는 용량에 맞춰서 1MB만 잡게 된다. int max_size = 1024*1024*100; /* MULTIPARTREQUEST MULTIPARTREQUEST는 파일 업로드에 사용하는 클래스로 COS 라이브러리가 없으면 사용할 수 없다. 해당 클래스에 들어가는 파라미터는 아래와 같다. - REQUEST 객체 (REQUEST는 파일 형식을 받을 수 없으므로 MULTIPARTREQUEST객체를 사용하여 받는다.) - 업로드한 파일을 저장할 경로 - 업로드할 파일의 최대 크기 - 인코딩 타입 - 동일 파일명 정책 (파일명이 중복되는 경우 자동으로 넘버링하는 기능) */ MultipartRequest mr = new MultipartRequest(request,path,max_size,"utf-8", new DefaultFileRenamePolicy()); // 업로드된 파일 정보 받아오기 String filename = "no_file"; // GETFILE은 업로드된 파일을 파일 객체 타입으로 리턴한다. // 파일이 없는 경우 NULL로 리턴한다. File f = mr.getFile("photo"); // GETNAME은 파일의 명칭을 가져오는 메소드이다. if(f!=null) { filename = f.getName(); } // GETPARAMETER는 NAME속성의 값을 얻는 메소드이다. // MULTIPARTREQUEST사용시 일반 파라미터도 MR객체로 위임하여 처리하는 것으로 약속되었으로 // 파일형식이 아닌 데이터도 반드시 MR객체(MULTIPARTREQUEST)를 사용해야한다. String title = mr.getParameter("title"); // 받은 정보를 REQUESTSCOPE에 저장 request.setAttribute("title", title); request.setAttribute("filename", filename); // BINDING & FORWARDING RequestDispatcher disp = request.getRequestDispatcher("result.jsp"); disp.forward(request, response); } }

from http://hikr90.tistory.com/136 by ccl(A) rewrite - 2021-12-29 21:01:16