IT 관련,,/Java관련 언어들

[JSP/서블릿]jsp 파일업로드,,

IT깡패's 2018. 8. 6. 21:37
728x90
반응형
SMALL


COS 라이브러리

JSP에서 자주 사용되는 기능인 파일 업로드는 Java에서 기본으로 지원하지 않지만, cos.jar 오픈 라이브러리를 이용하면 쉽게 구현 가능할 수 있습니다.


- COS 라이브러리를 얻을 수 잇는 주소

  http://servlet.com/cos/

웹페이지 하단에서 볼 수 있는 Download 항목에서 cos파일을 다운 받습니다.

압축 파일 내 lib폴더의 cos.jar 파일을 복사하여 자신의 프로젝트의 WebContent/WEB-INF/lib 폴더에 불혀 넣습니다.


- 파일 업로드를 위한 form태그

method를 post로 지정 get으로 지정하면 파일 업로드 연결을 할 수 없게됨,,

enctype 속성을 mulitpart/formdata로 추가

input 태그의 type을 file로 지정 


enctype 속성을 multipart/formdata는 서버로 데이터가 전송될 때 일반 텍스트뿐만 아니라 파일 형식의 데이터도 전송됨을 알리기 위해 지정하는 것입니다.

이를 추가하지 않으면 file선택 박스에서 선택된 파일의 이름만 텍스트로 전송되고 파일 객체가 서버로 전송되지 않습니다.

또한 파일을 전송할 경우 form으로 전송하는 데이터의 크기가 커지므로 위에서 말한 것처럼 get메소드 방식으로 전송하는 것이 불가능해집니다.


파일 업로드 하기

- 파일 전송 폼화면(WebContent/FileUpload.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here



commons-Fileupload를 이용한 파일 업로드




- 파일 업로드를 위한 서블릿 클래스(src/fileupload/FileUploadServlet.java)

package fileupload;

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

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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import java.util.Iterator;
import java.util.List;


/**
 * Servlet implementation class FileUploadServlet
 */
@WebServlet("/file/commonsUpload.do")
@SuppressWarnings("serial")
public class FileUploadServlet extends HttpServlet {
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		// 1. 파일 처리에 유효한 request인지 판단
		boolean isMultipart = 
		    ServletFileUpload.isMultipartContent(request);
		
		if(isMultipart) {
			// 파일전송이 된 자식
			
			// 디스크기반의 파일 아이템 팩토리
			DiskFileItemFactory factory;
			factory = new DiskFileItemFactory();
			
			int maxMem = 1 * 1024 * 1024; // 1MB
			int maxRequest = 10 * 1024 * 1024; // 10MB
			
			//2. maxMem보다 작다면 메모리에서 처리
			factory.setSizeThreshold(maxMem); //메모리사이즈 결정
			
			File repository =
					new File(getServletContext().getRealPath("tmpFile"));
			
			//3. maxMem보다 큰 아이템이라면 임시파일을 만들어 디스크처리
			factory.setRepository(repository);
			
			//4. 업로드 가능한지 체크
			ServletFileUpload upload;		
			upload = new ServletFileUpload(factory);
			
			// 업로드 허용 크기 설정
			upload.setSizeMax(maxRequest);
			
			//5. 업로드 데이터 파싱(추출)
			//파일 업로드 - 임시파일이 생성됨
			List items = null;
			try {
				items = (List)upload.parseParameterMap(request);
			} catch (FileUploadException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			// 6. 폼필드의 형식에 따른 처리
			Iterator iter = items.iterator();
			while(iter.hasNext()) {
				// 파싱(추출)한 아이템 선택
				FileItem item = (FileItem) iter.next();
				
				// 빈 파일 업로드 시 처리 안함
				if(item.getSize() <= 0) continue;
				
				if(item.isFormField()) {
					//텍스트 필드 처리
					out.print(
							"폼 필드: " + item.getFieldName()
							+ ", 값 : " + item.getString()
							+ "
"); }else { //아이템 파일일 때 처리 String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); boolean isMem = item.isInMemory(); long size = item.getSize(); out.print( "fieldName : " + fieldName + "
" + "fileName : " + fileName + "
" + "contentType : " + contentType + "
" + "메모리 사용여부 : " + isMem + "
" + "크기 : " + size + "
"); //실제 업로드 File up = new File( getServletContext().getRealPath("uploadFile"), fileName); System.out.println(getServletContext().getRealPath("uploadFile")); try { item.write(up); } catch (Exception e) { e.printStackTrace(); } } } }else { out.print("

encType이 multipart/form-data가 아님

"); } } }

uploadFile폴더는 C:\Users\user\eclipse-workspace\FileUploadEx_01\WebContent\uploadFile안에 들어있는데 이클립스에서도 띄우게

하였습니다..

MultipartRequest클래스는 cos.jar 라이브러리에서 제공되는 파일 업로드를 담당하는 클래스입니다.

파일 업로드를 담당하는 생성자와 메소드를 포함됩니다.


- 파일 업로드를 하기 위한 import

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.mulitpart.DefaultFleRenamePolicy;


- MultipartRequest생성자와 메소드

request   :   MultipartRequest 객체와 연결될 request 객체

saveDirectory   :   서버 측에 지정될 경로

maxPostSize   :   업로드 최대 크기

encoding   :   파일 인코딩 방식(파일 이름이 한글일 경우 UTF-8 지정)

policy  :   파일 중복 처리를 어떻게 할지 결정

getParameterNames()  :  폼에서 전송된 파라미터 열거체로 리턴

getParameter()  :  객체의 해당 파라미터 값을 가져옴

getContentType()  :  업로드 파일의 컨텐트 타입 확인

getFile()  :  서버에 업로드 된 파일 정보를 객체로 얻어옴


파일 다운로드 하기

- 파일 전송 폼 화면(WebContent/fileList.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here



이미지다운


이미지다운



- 파일 다운로드를 위한 서블릿클래스(src/filedownload/FileDownloadServlet.java)

package filedownload;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
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;


@WebServlet("/downloadFile.do")
public class FileDownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doPost(request, response);
		 
		
	}
	
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		String path = getServletContext().getRealPath("uploadFile");
		//System.out.println(path);
		
		File file = new File(path, "K-001.jpg");
		
		// 파일이 존재하는지, 디렉토리가 아닌지 체크
		if(file.exists() && file.isFile()) {
			//다운로드 파일의 MIME 설정
			res.setContentType("application/octet-stream");
			res.setHeader("Content-Length", String.valueOf(file.length()));
			
			// 다운 파일의 이름 설정
			// 무조선 다운받게 만들어 줌
			res.setHeader("Content-Disposition", "attachment;fileName="+
			                               new String(file.getName().getBytes("UTF-8"), "8859_1")+";");
			
			// 파일 불러오기
			FileInputStream fis = new FileInputStream(file);
			
			// 브라우저로 출력
			BufferedOutputStream out = new BufferedOutputStream(res.getOutputStream());
			
			int len = 0;
			byte[] buf = new byte[1024];
			
			while((len = fis.read(buf)) != -1) {
				out.write(buf, 0, len);
			}
			
			out.flush();
			out.close();
			fis.close();			
			
		}		


JSP와 서블릿을 이용한 파일업로드와 다운로드 화면이였습니다.

라이브러리는 cos.jar외에 commons-fileupload-1.3.3jar, commons-io-2.6.jar를 추가하였습니다.

728x90
반응형
LIST