1. Java SE 파일 업로드 및 다운로드의 기초 메커니즘
파일 전송 기능은 웹 개발에서 흔하게 사용되는 기능입니다. 본 문서에서는 소규모 파일 업로드에 초점을 맞추고 있으며, 대용량 파일 처리는 전용 도구 또는 라이브러리를 사용하는 것이 일반적입니다.
파일 전송을 위해 다음 패키지가 필요합니다:
- java.io 패키지
- javax.servlet 패키지
- org.apache.commons.fileupload 관련 라이브러리
1.1 파일 업로드 원리
업로드 시 주요 설정 요소:
- 폼 제출 방식: POST 메서드 사용 필수
- 인코딩 타입: multipart/form-data 지정 (이진 데이터 전송 지원)
- 서버 측 처리: 파일 항목별 구분 처리 및 저장 경로 관리
핵심 코드 구조:
// 파일 업로드 처리 로직
public void handleUpload(HttpServletRequest request) {
if (isMultipartContent(request)) {
FileStorageFactory factory = new FileStorageFactory();
FormParser parser = new FormParser(factory);
List<FormItem> items = parser.parse(request);
for (FormItem item : items) {
if (item.isBinary()) {
String fileName = generateUniqueFileName(item.getName());
saveToDisk(item.getInputStream(), fileName);
} else {
String textValue = item.getString();
// 텍스트 값 처리 로직
}
}
}
}
1.2 파일 다운로드 원리
다운로드 시 주요 응답 헤더:
- Content-Disposition: 파일 다운로드 지시 (attachment) 또는 내부 표시 (inline)
- Content-Type: MIME 타입 지정 (ex: image/png)
핵심 코드 구조:
// 파일 다운로드 처리 로직
public void handleDownload(HttpServletRequest request, HttpServletResponse response) {
String fileName = request.getParameter("filename");
// MIME 타입 조회
String mimeType = getMimeType(fileName);
response.setContentType(mimeType);
// 브라우저 호환성 처리
if (isFirefox(request)) {
setBase64FilenameHeader(response, fileName);
} else {
setUrlEncodedFilenameHeader(response, fileName);
}
// 파일 스트림 전송
InputStream inputStream = getResourceAsStream(fileName);
IOUtils.copy(inputStream, response.getOutputStream());
}
2. 실무 적용 사례
2.1 파일 업로드 예제
JSP 폼 예시:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" onchange="previewImage(this)" />
<input type="text" name="description" />
<input type="submit" value="업로드" />
</form>
Servelt 처리 로직:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
List<FormItem> items = parseRequest(request);
for (FormItem item : items) {
if (!item.isBinary()) {
// 텍스트 입력 처리
} else {
// 파일 저장 로직
String savedPath = saveFile(item.getInputStream(),
generateUniqueFileName(item.getName()));
response.getWriter().write("파일 저장 완료: " + savedPath);
}
}
} catch (Exception e) {
// 오류 처리
}
}
2.2 파일 다운로드 예제
다운로드 링크 예시:
<a href="/download?file=report.pdf">보고서 다운로드</a>
Servelt 처리 로직:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
String fileName = request.getParameter("file");
// 파일 존재 여부 확인
if (fileExists(fileName)) {
// 다운로드 헤더 설정
setDownloadHeaders(response, fileName);
// 파일 전송
transferFile(fileName, response.getOutputStream());
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
3. 고급 고려 사항
- 대용량 파일 처리: 분할 전송, 프로세스 관리
- 보안 처리: 파일 확장자 검증, 크기 제한
- 브라우저 호환성: 인코딩 방식 자동 감지
- 효율적인 저장 경로: 시간 기반 폴더 구조
4. 결론
본 문서에서는 Java SE 기반의 파일 전송 기능의 핵심 원리를 설명했습니다. 실제 개발에서는 Spring MVC 등 프레임워크를 사용하여 보다 효율적으로 처리할 수 있습니다. 하지만 이 기초 원리는 현대 웹 애플리케이션에서 파일 처리 기능을 이해하는 데 중요한 역할을 합니다.