JAVA 파일 업로드 , 다운로드

윤슬·2025년 9월 22일

자바 파일 업로드/다운로드 및 입출력 정리

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 (배포 후, 서버 실행 폴더)
  • 프로젝트 경로 예시
// 방법 1 : PC별 경로
String projectPath1 = "C:\\Users\\tj-bu-702-teacher\\Desktop\\tj2025A_web1";

// 방법 2 : 현재 PC 프로젝트 절대경로 반환
String projectPath2 = System.getProperty("user.dir");

// 업로드 경로 연결
String uploadPath = System.getProperty("user.dir") + "/build/resources/main/static/upload/";

8. File 클래스

  • 자바에서 외부 파일을 조작하는 클래스
// 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();
profile
우상향그래프

0개의 댓글