단순한 자바 코드로 작성하여 처리할 수 없어 오픈 라이브러리인 cos.jar나 commonsfileupload.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>
"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>
첫 실행화면
파일을 넘겨도 화면에 보이는 건 없지만
경로를 따라가면 파일이 복사되어 저장된 모습을 확인할 수 있다