클라이언트 시스템에 존재하는 파일을 서버로 전송
데이터 베이스에 저장하지 않고 서버 내의 지정된 폴더에 저장
파일 업로드 구현시에는 절대 경로를 사용해야 함
<form method="post" enctype="multipart/form-data" ''' >
업로드되는 파일이 저장되는 메모리나 저장소에 대한 객체
Commons-FileUpload 라이브러리를 사용할 경우
업로드된 파일은바로 폴더에 저장되지 않고 메모리나 파일 저장소에 임시 저장된 후 최종 위치로 복사됨.
DIskFileItemfacotry는 업로드 되는 파일이 저장되는 메모리나 저장소에 대한 객체임 -> 반드시 생성되어야함
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(크기);
factory.setRepository(저장소의 파일 객체);
전달된 데이터를 다루기 쉽도록 변환
ServletFileUpload upload = new ServletFileUpload(DiskFileItemFactory 객체)
List<FileItem> items = upload.parseRequest(request)
HtttpServletRequest 객체를 통해 전달된 모든 데이터를 FIleItem 형식으로 변환해 items 리스트에 저장

@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();
}
}
}

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 속성으로 지정