웹 개발 경험이 있는 개발자라면 파일 업로드 기능에 익숙할 것입니다. 하지만 자신의 웹사이트에 파일 업로드 기능을 구현하는 방법은 많은 개발자에게 어려운 과제일 수 있습니다. 최근 웹 개발 프로젝트를 진행하며 웹 환경에서 파일 업로드가 작동하는 원리를 정리해 보았습니다. 이 글에서는 파일 업로드의 핵심 구현 방법을 소개합니다.
JSP 페이지의 주요 코드:
<body>
<h1>단일 파일 업로드</h1>
<hr/>
<form action="upload" method="post" enctype="multipart/form-data">
파일 선택<input type="file" name="document"/><br/>
<input type="submit" value="업로드 시작"/>
</form>
<h1>파일 이름 지정 업로드</h1>
<hr/>
<form action="customName" method="post" enctype="multipart/form-data">
원하는 파일 이름<input type="text" name="customName"/><br/>
파일 선택<input type="file" name="document"/><br/>
<input type="submit" value="업로드 시작"/>
</form>
<h1>자동 파일 이름 생성 업로드</h1>
<hr/>
<form action="autoName" method="post" enctype="multipart/form-data">
파일 선택<input type="file" name="document"/><br/>
<input type="submit" value="업로드 시작"/>
</form>
<h1>다중 파일 업로드</h1>
<hr/>
<form action="multiUpload" method="post" enctype="multipart/form-data">
파일1<input type="file" name="document"/><br/>
파일2<input type="file" name="document"/><br/>
파일3<input type="file" name="document"/><br/>
<input type="submit" value="모두 업로드"/>
</form>
</body>
이제 각 업로드 방식에 대한 구현 코드를 소개합니다.
<strong>단일 파일 업로드 처리:</strong>
FileHandler handler = new FileHandler();
handler.initialize(this.getServletConfig(), request, response);
try {
handler.processUpload();
handler.saveTo("uploads");
} catch (FileUploadException e) {
e.printStackTrace();
}
사용자 지정 파일 이름 업로드:
FileHandler handler = new FileHandler();
handler.initialize(this.getServletConfig(), request, response);
try {
handler.processUpload();
String customName = handler.getRequest().getParameter("customName");
String storagePath = this.getServletContext().getRealPath("/uploads");
String extension = handler.getUploadedFiles().getFile(0).getExtension();
String fullFileName = storagePath + File.separator + customName + "." + extension;
handler.getUploadedFiles().getFile(0).storeAs(fullFileName);
} catch (FileUploadException e) {
e.printStackTrace();
}
<strong>자동 파일 이름 생성 업로드:</strong>
FileHandler handler = new FileHandler();
handler.initialize(this.getServletConfig(), request, response);
String generatedFileName = "";
try {
handler.processUpload();
FileNameGenerator generator = new FileNameGenerator();
String uniqueName = generator.createUniqueName();
String storagePath = this.getServletContext().getRealPath("/uploads");
String extension = handler.getUploadedFiles().getFile(0).getExtension();
String fullFileName = storagePath + File.separator + uniqueName + "." + extension;
handler.getUploadedFiles().getFile(0).storeAs(fullFileName);
generatedFileName = uniqueName + "." + extension;
} catch (FileUploadException e) {
e.printStackTrace();
}
고유 파일 이름 생성 유틸리티 클래스:
package com.utils.file;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
public class FileNameGenerator {
public FileNameGenerator() {
// 생성자
}
public String createUniqueName() {
// UUID 생성
String uuid = UUID.randomUUID().toString().replace("-", "");
// 현재 시간 정보 추가
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String timestamp = dateFormat.format(new Date());
// 고유 이름 조합
return uuid + "_" + timestamp;
}
public static void main(String[] args) {
FileNameGenerator generator = new FileNameGenerator();
System.out.println("생성된 고유 파일 이름: " + generator.createUniqueName());
}
}
<strong>다중 파일 업로드 처리:</strong>
FileHandler handler = new FileHandler();
handler.initialize(this.getServletConfig(), request, response);
try {
handler.processUpload();
for(int i = 0; i < handler.getUploadedFiles().getFileCount(); i++) {
FileNameGenerator nameGenerator = new FileNameGenerator();
String uniqueName = nameGenerator.createUniqueName();
String storagePath = this.getServletContext().getRealPath("/uploads");
String extension = handler.getUploadedFiles().getFile(i).getExtension();
String fullFileName = storagePath + File.separator + uniqueName + "." + extension;
handler.getUploadedFiles().getFile(i).storeAs(fullFileName);
}
} catch (FileUploadException e) {
e.printStackTrace();
}
위 코드를 통해 다양한 파일 업로드 시나리오를 구현할 수 있습니다. 각 방법은 특정 요구사항에 맞게 선택하여 사용할 수 있습니다.