자바 파일 업로드/다운로드 및 입출력 정리
1. 클라이언트와 서버
- 클라이언트 : 사용자
- 서버 : 자바(Spring/Tomcat) 실행 결과
2. 업로드 & 다운로드
- 업로드 : 클라이언트가 서버에게 데이터(파일)을 전송하는 행위
- 다운로드 : 서버가 클라이언트에게 데이터(파일)을 전송하는 행위
3. 스트림(Stream)
- 데이터(바이트)의 이동 흐름
- 입출력, 네트워크, 파일 처리 등에서 사용
- 바이트(Byte) : 8bit, 윈도우 기본 저장 단위
4. 버퍼(Buffer)
- 데이터가 이동하는 흐름 간 처리 속도를 일정하게 하기 위한 임시 저장소
5. 자바 입출력
- INPUT : 외부 → 자바 메모리 (예:
FileInputStream)
- OUTPUT : 자바 메모리 → 외부 (예:
ServletOutputStream)
- 서블릿(Servlet) : 자바에서 HTTP 요청/응답 처리 기술을 가진 클래스
6. UUID (범용 고유 식별자)
String uuid = UUID.randomUUID().toString();
7. 업로드 폴더
- 방법 1 : 프로젝트 폴더 내
src (배포 전, 개발자가 코드를 작성하는 폴더)
- 방법 2 : 프로젝트 폴더 내
build (배포 후, 서버 실행 폴더)
- 프로젝트 경로 예시
String projectPath1 = "C:\\Users\\tj-bu-702-teacher\\Desktop\\tj2025A_web1";
String projectPath2 = System.getProperty("user.dir");
String uploadPath = System.getProperty("user.dir") + "/build/resources/main/static/upload/";
8. File 클래스
File file = new File("파일경로");
boolean exists = file.exists();
boolean created = file.mkdir();
long size = file.length();
boolean deleted = file.delete();
9. 스프링 업로드 구현 방법
1. MultipartFile 인터페이스 이용한 첨부파일(바이트) 매핑
- MultipartFile ? 주로 대용량 바이트 파일을 매핑/조작 할때 사용되는 인터페이스
- @ModelAttribute 매핑한다.
- 여러개 첨부파일 : List<MultipartFile>
- 첨부파일 업로드 용량 제한 : application.properties 설정한다.
spring.servlet.multipart.max-file-size = 10MB
spring.servlet.multipart.max-request-size = 100MB
2. MultipartFile 주요 메소드
1) .transferTo( 파일객체 ); : 지정한 파일객체 경로에 첨부파일을 업로드(이동) , 일반 예외발생
2) .getOriginalFilename(); : 첨부파일의 파일명 반환
- uuid+"_"+multipartFile.getOriginalFilename() : 사용자들의 첨부파일명 중복 제거 위한방법
10. JS에서 fetch 로 (첨부파일/대용량)폼 전송
1. const form = document.querySelector( 폼식별자명 ); : 일반(텍스트위주)폼
* 자바와 통신할 경우 form 마크업내 name 속성명 과 자바의 매개변수(dto/map)들의 속성명이 일치
* <input name="pname" /> --------> class productDto{ String pname }
2. const formData = new FormData( form ); : 일반(텍스트위주)폼 --> 데이터(바이트)폼 전환
* 기본 폼 속성외 속성 추가 : formData.append( '속성명' , 값 );
3. const option = { method : "POST" , body : formData }
* 데이터폼 전송시 HTTP content-type 타입은 multipart/form-data 이며 fetch 생략 가능,
11. 다운로드 구현 방법
1. 흐름구조
1) 자바가 다운로드 받을 파일을 바이트로 가져온다.
클라이언트 ----- 짱구.jpg 주세요. -----> 서버(자바) ----- 짱구.jpg Input ----> build
1. FileInputStream fin = new FileInputStream( 파일객체 );
2. long fileSize = file.length();
3. byte[] bytes = new byte[ (int)fileSize ];
4. fin.read( bytes );
2) 가져온 바이트를 클라이언트에게 보낸다.
클라이언트 <--- 짱구.jpg Output <----- 서버(자바)
* FileOutputStream 아닌 ServletOutputStream
1. ServletOutputStream fout = response.getOutputStream();
2. fout.write( bytes );
2. 다운로드시 브라우저의 다운로드 형식 지정
response.setHeader( "Content-Disposition" , "attachment;filename="+ "파일명" );
3. 스트림(버퍼) 안전하게 닫기
fin.close(); : 스트림 객체를 수동으로 직접 제거하는 방법
fout.close();