.jsp 연습하기 - 파일 업로드

오늘·2021년 5월 6일
0

웹 페이지 연습

목록 보기
8/35

파일 업로드(file upload)

  • 웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것
  • 서버로 업로드할 수 있는 파일 종류
    : 텍스트 파일, 바이너리 파일, 이미지 파일, 문서 등 다양한 유형이 있음
  • 웹 브라우저에서 서버로 파일을 전송하기 위해 폼 태그를 사용한다.
  • 전송된 파일을 서버에 저장하기 위해서는 오픈 라이브러리를 이용

파일 업로드 처리 방법

단순한 자바 코드로 작성하여 처리할 수 없어 오픈 라이브러리인 cos.jar나 commonsfileupload.jar를 사용한다.

  1. MultipartRequest
    가장 간단한 방법으로 cos.jar 라이브러리만 lib에 추가하면 된다.
  2. 아파치 API 이용
    편리하고 강력한 API가 제공된다.
    commons-fileupload.jar / commons-io.jar 라이브러리를 추가해야 한다.

파일 보내기

enctype 속성은 반드시 multipart/form-data로 설정해야 한다.
-> enctype="multipart/form-data"

input 태그의 type 속성은 file로 설정
<input type="file" name="filename">

예시

<form name="fileForm" method="post" enctype="multipart/form-data"
	action="1_process.jsp" >
	<p> 이름 : <input type="text" name="name"> <br>
		제목 : <input type="text" name="title"> <br>
		파일 : <input type="file" name="filename"> <br>
		<input type="submit" value="submit">
</form>

받는 쪽은 이렇다

<body>
	<P> 파일 업로드 서버 쪽 부분 파일 </P>
	<%
		// request
		// 저장위치
		// 크기
		// 처리 타입
		// 똑같은 파일 두번 받으면 이름 뒤에 (1), (2) 이렇게 표시해주겠다.
		MultipartRequest multi = 
			new MultipartRequest(request, "c:\\temp", 5*1024*1024, "utf-8", new DefaultFileRenamePolicy());
	
		Enumeration params = multi.getParameterNames();
		
		while(params.hasMoreElements()) {
			String name = (String) params.nextElement();
			String value = multi.getParameter(name);
			out.println(name + " " + value + "<br>");
		}
		out.print ("----------------------------- <br>");
		
		Enumeration files = multi.getFileNames();
		while (files.hasMoreElements()) {
			String name = (String) files.nextElement();
			String filename = multi.getFilesystemName(name);
			String original = multi.getOriginalFileName(name);
			String type = multi.getContentType(name);
			File file = multi.getFile(name);
			
			out.print("요청 파라미터 이름 : " + name + "<br>");
			out.print("실제 파일 이름 : " + original + "<br>");
			out.print("저장 파일 이름 : " + filename + "<br>");			
			out.print("파일 콘텐츠 유형 : " + type + "<br>");
		
			if (file != null) {
				out.print("파일 크기 : " + file.length());
				out.print("<br>");
			}
		}
	%>
</body>

만약 한번에 여러 개를 보내고 싶다면?

name 을 구별해서 사용하면 된다.

<p> 파일 여러개 업로드 </p>
<form name="fileForm" method="post" enctype="multipart/form-data" action="2_process.jsp">
	<p> 이름 1 : <input type="text" name="name1"> <br>
		제목 1 : <input type="text" name="subject1"> <br>
		파일 1 : <input type="file" name="filename1"> </p>
			
	<p> 이름 2 : <input type="text" name="name2"> <br>
		제목 2 : <input type="text" name="subject2"> <br>
		파일 2 : <input type="file" name="filename2"> </p>

	<p> 이름 3 : <input type="text" name="name3"> <br>
		제목 3 : <input type="text" name="subject3"> <br>
		파일 3 : <input type="file" name="filename3"> </p>
			
		<input type="submit" value="전송">
</form>

받을 때는 이렇다

<body>
	<p> 파일 여러개 받기 </p>
	<%
		MultipartRequest multi = 
			new MultipartRequest(request, "c:\\temp", 5*1024*1024, "utf-8", new DefaultFileRenamePolicy());
	
		// 이름과 제목 가져오기
		String name1 = multi.getParameter("name1");
		String subject1 = multi.getParameter("subject1");
		String name2 = multi.getParameter("name2");
		String subject2 = multi.getParameter("subject2");
		String name3 = multi.getParameter("name3");
		String subject3 = multi.getParameter("subject3");
		
		// 파일 받기
		Enumeration files = multi.getFileNames();
		
		String file1 = (String) files.nextElement();
		String filename1 = multi.getFilesystemName(file1);

		String file2 = (String) files.nextElement();
		String filename2 = multi.getFilesystemName(file2);
		
		String file3 = (String) files.nextElement();
		String filename3 = multi.getFilesystemName(file3);
	%>
	
	이름 1 : <%= name1 %> <br>
	제목 1 : <%= subject1 %> <br>
	파일 1 : <%= filename1 %> <br>
	<hr>
	이름 2 : <%= name2 %> <br>
	제목 2 : <%= subject2 %> <br>
	파일 2 : <%= filename2 %> <br>
	<hr>
	이름 3 : <%= name3 %> <br>
	제목 3 : <%= subject3 %> <br>
	파일 3 : <%= filename3 %> <br>
</body>

commons-fileupload 외부 라이브러리 이용하기

"3_file_upload.jsp"

<body>
	<p> 아파치에서 제공하는 commons-fileupload 외부 라이브러리 이용하기 </p>
	<form action="3_file_process.jsp" method="post" enctype="multipart/form-data">
		<o> 파일 : <input type="file" name="filename">
		<p> <input type="submit" value="send">
	</form>
</body>

"3_file_process.jsp"

<body>
	<p> Commons-fileupload를 이용하여 파일 업로드 </p>
	<%
		String fileUploadPath = "c:\\temp";
		DiskFileUpload upload = new DiskFileUpload(); // 객체화
		List items = upload.parseRequest(request);
		Iterator it = items.iterator();
		while(it.hasNext()){
			FileItem fileItem = (FileItem) it.next();
			if( !fileItem.isFormField()) {
				String fileName = fileItem.getName();
				fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
				File file = new File(fileUploadPath + "/" + fileName);
				fileItem.write(file);
			}
		}
	%>
</body>

첫 실행화면

파일을 넘겨도 화면에 보이는 건 없지만

경로를 따라가면 파일이 복사되어 저장된 모습을 확인할 수 있다


0개의 댓글

관련 채용 정보