서블릿 13장

조선영·2023년 6월 5일
0

파일 업로드

클라이언트 시스템에 존재하는 파일을 서버로 전송

데이터 베이스에 저장하지 않고 서버 내의 지정된 폴더에 저장

파일 업로드 구현 방법

  • commons-fileupload
    apache Commons에서 제공하는 파일 업로드 라이브러리
  • COS (Com Oreilly Servlet)
    http://www.wervlets.com에서 제공하는 파일 업로드 라이브러리

파일 업로드 구현시에는 절대 경로를 사용해야 함

파일 업로드를 위한 구성 요소

form 요소의 속성 지정

<form method="post" enctype="multipart/form-data" ''' >
  • method
    파일 업로드를 위해서는 반드시 post 방식을 사용해야 함

Commons FileUpload - DiskFileItemFactory

업로드되는 파일이 저장되는 메모리나 저장소에 대한 객체

Commons-FileUpload 라이브러리를 사용할 경우
업로드된 파일은바로 폴더에 저장되지 않고 메모리나 파일 저장소에 임시 저장된 후 최종 위치로 복사됨.
DIskFileItemfacotry는 업로드 되는 파일이 저장되는 메모리나 저장소에 대한 객체임 -> 반드시 생성되어야함

  • setSizeThreshold(int) : 메모리가 저장될 수 있는 파일의 최대 크기를 바이트 단위로 지정
  • setRepository(File) : setSizeThreshold()에서 지정한 크기보다 큰 파일이 업로드되면 임시로 사용할 위치 File 객체로 지정
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(크기);
factory.setRepository(저장소의 파일 객체);

Commons FileUpload - ServletFileUpload

전달된 데이터를 다루기 쉽도록 변환
  • parseRequest(HttpServletRequest) : multipart/form-data 형식으로 전달된 데이터를 FileItem 객체로 변환
ServletFileUpload upload = new ServletFileUpload(DiskFileItemFactory 객체)
List<FileItem> items = upload.parseRequest(request)

HtttpServletRequest 객체를 통해 전달된 모든 데이터를 FIleItem 형식으로 변환해 items 리스트에 저장

Commons FileUpload - 파일 업로드 구현

@WeebServlet("/commons")
public class CommonsFileUp extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
    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();
    
    //최종 파일이 저장되는 위치의 경로 추출
    ServletContext context = getServletContext();
    String realFolder = context.getRealPath("uploaded_files");
    
    //DiskFileItemFactory 객체 생성
    DiskFileItemFactory factory = new DiskFileItemFactory();
    
    //업로드 되는 파일의 크키 1Mbytes로 지전
    factory.setSizeThreshold(1024*1024);
    
    //업로드된 파일 크기가 1MB 이상인 경우 파일이 최종 저장되는 곳을 임시 저장소로 지정
    File currentDirAndPah = new File(realFolder);
    factory.setReponsitory(currentDirAndPah);
    
    //ServletFileUpload 객체 생성
    ServletFileUpload load = new ServletFileUpload(factory);
    
    try{
    	//multipart/form-data 형식으로 전달된 모든 데이터를 List에 저장
        List<FileItem> items = upload.parseRequest(request);
        
        for(ini i=0; i<items.size(); i++){
        	//리스트로부터 순차적으로 데이터 추출
            FileItem fileItem = (FileItem)items.get(i);
            
            if(fileItem.isFormField()) {
            	//추출한 데이터가 일반 텍스트인 경우 파라미터의 이름과 값 출력
                out.println(fileItem.getFieldName() + " : " + fileItem.getString("utf-8") + "<br><br>");
            } else {
            	//추출한 데이터가 파일인 경우
                if(fileItem.getSize() > 0) {
                	//파일 이름을 추출해 출력
                    String fileName = (String)fileItem.getName();
                    out.println("filename : <br> " + fileName + "<br><br>");
                    //파일을 최종 위치인 uploaded_files에 저장하기 위해 파일 객체 생성
                    File uploadFile = new File(DirAndFilename);
                    
                    //중복된 파일이 있는 경우 처리
                    if(uploadFile.exists()){
                    	//파일 이름과 확장자 분리
                        //fext == 확장자
                        int pos = fileName.lastIndexOf(".");
                        String fname = fileName.substring(0,pos);
                        String fext = fileName.substring(pos+1);
                        
                        //중복된 이름 존재하지 않을 때까지 순환
                        for(int j=1; true; j++){
                        	//숫자를 증가해가며 파일 이름을 파일명.확장자형식으로 변경
                            fileName = fname + "(" + j + ")." + fext;
                            DirAndFilename = realFolder + "\\" + fileName;
                            uploadFile = new File(DirAndFilename);
                            
                            //중복된 파일이 있는지 다시 조사
                            //없다면 파일 최종이름으로 지정
                            if(!uploadFile.exists()) {
                            	break;
                            }
                        }
                    }
                    fileItem.write(uploadFile);
                    
                    //파일 크기 출력
                    out.println("size : <br>" + fileItem.getSize() + "bytes <br><hr>");
                }
            }
        }
    } catch(Exception e) {
    	e.printStackTrace();
    }
  }
}

COS - MultipartRequest

MultipartRequest multi = new MultipartRequest(''');
String 변수 = multi.getParameter("파라미터"); //파라미터 추출
  • saveDirectory : 업로드 되는 파일이 저장되는 폴더 지정

  • maxPostSize : POST 방식으로 업로드되는 파일 최대크기를 바이트 단윌 지정

  • encoding : 업로드 파일 인코딩할 문자집합 지정

  • DefaultFileRenamePolicy : 업로드하는 파일 이름이 중복 문제 해결

  • getFileNames() 메서드 : FORM 요소의 file 입력양식의 파라미터 이름을 enumeration 형식으로 반환

  • getContentType(String name) 메서드 : 업로드하는 파일의 MIME 타입 반환

  • getFile(String name) 메서드 : 업로드하는 파일의 File 객체 반환

  • getOriginalFileName(String name) 메서드 : 브라우저에서 업로드하는 파일의 이름 반환

  • getFileSystemName(String name) 메서드 : 업로드되어 서버에 저장하는 파일 이름 반환

  • getParameter(String name) : 클라이언트에서 전달된 파라미터 추출

파일 다운로드 구현

다운로드 대상을 a태그의 href 속성으로 지정

profile
UX 기획도 하고 서비스 기획도 하고 PM도 하고 프론트도 하고 PL도 하는 중

0개의 댓글