본문 바로가기
Develop/Java

[Java, Spring] 파일 다운로드

by 연로그 2021. 3. 22.
반응형

추가 개발 건에 파일 다운로드 기능을 만들어야 해서 관련 코드를 찾아보았다.

Java로 구현하는 법, Spring으로 구현하는 법 두 가지 코드를 중점으로 살펴보겠다.

 


Java

 

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

public class FileDownJava {
    public static void main(String[] args) {
        // 원격 파일 다운로드 URL
        String fileUrl  = "https://k.kakaocdn.net/dn/crbxqN/btqAPdDwLQJ/9IkFx8zBJcKWYHMahWrar0/img.jpg";
        String fileName = UUID.randomUUID().toString();                 // 파일명 (랜덤생성)
        int    index    = fileUrl.lastIndexOf(".");                     // . 위치 뒤에서부터 찾기
        String ext      = fileUrl.substring(index);                     // 파일 확장자 추출
        Path   target   = Paths.get("파일 저장할 경로", fileName + ext); // 파일 저장 경로
	
        try {
            URL url = new URL(fileUrl);
            
            InputStream in = url.openStream();
            Files.copy(in, target); // target 경로로 파일 복사
            in.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 콘솔에 별다른 로그가 찍히지 않음
  • 별도의 라이브러리 필요 X
  • 잘못된 경로 입력 시 java.nio.file.NoSuchFileException 에러

 

URL

생성자

  • URL (String spec): URL 객체 생성
  • URL (String protocol, String host, int port, String file): 프로토콜 식별자, 호스트 주소, 포트 번호, 파일 이름에 대한 URL 객체 생성

 

주요 메소드

메소드 설명
Object getContent() return 컨텐츠
String getFile() return 파일 이름
String getHost() return 호스트 이름
String getPath() return 경로
int getPort() return 포트 번호
String getProtocol() return 프로토콜 이름
InputStream openStream() URL 주소와 연결 + return 연결로부터 입력받을 수 있는 InputStream 객체
URLConnection openConnection() URL 주소의 원격 객체에 접속 + return 통신 가능한 URLConnection 객체

 

Files

  • File: java.io 패키지에 속한 기존의 파일이나 폴더에 대한 제어를 하는데 사용하는 클래스
  • Files: Path 객체를 이용해 파일 시스템 작업 수행

 


Spring

 

import java.io.IOException;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

public class FileDownSpring {
    public static void main(String[] args) {
        // 원격 파일 다운로드 URL
        String fileUrl = "https://k.kakaocdn.net/dn/crbxqN/btqAPdDwLQJ/9IkFx8zBJcKWYHMahWrar0/img.jpg";
        URI    url     = URI.create(fileUrl);

        // 원격 파일 다운로드
        RestTemplate           rt     = new RestTemplate();
        ResponseEntity<byte[]> res    = rt.getForEntity(url, byte[].class);
        byte[]                 buffer = res.getBody();

        // 로컬 서버에 저장
        String fileName = UUID.randomUUID().toString();                    // 파일명 (랜덤생성)
        String ext      = "." + StringUtils.getFilenameExtension(fileUrl); // 확장자 추출
        Path   target   = Paths.get("파일 저장할 경로", fileName + ext);    // 파일 저장 경로

        try {
            FileCopyUtils.copy(buffer, target.toFile());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 콘솔에 실행 과정 중의 로그가 찍힘
  • 파일 저장 성공하면 200 OK가 뜸
  • 잘못된 경로 입력 시 java.nio.file.NoSuchFileException 에러

 

RestTemplate

  • spring 3.0부터 지원
  • http 통신에 유용하게 쓸 수 있는 Spring에서 제공하는 템플릿

 

주요 메소드

RestTemplateMethod HTTP Method 설명
execute Any HTTP 메소드 실행
exchange Any 헤더 세팅해서 HTTP Method로 요청 전송. return ResponseEntity
getForObject GET return 매핑받은 java Object
getForEntity GET return ResponseEntity
postForObject POST return ResponseEntity
put PUT  
delete DELETE  
headForHeaders HEAD URL 템플릿에 지정된 리소스의 모든 헤더 검색
optionsForAllow OPTIONS return 주어진 URI에 대한 Allow 헤더값

 

ResponseEntity

  • HttpEntity의 HttpHeader, HttpBody를 상속 받아 구현한 클래스-> RequestEntity, ResponseEntity
  • HttpRequest에 대한 응답 데이터를 포함하는 클래스
  • HttpStatus, HttpHeaders, HttpBody를 포함

 

getFilenameExtension()

  • 확장자명 가져오기
  • Spring의 Core 라이브러리에 있는 StringUtils에서 사용

 

FileCopyUtils

  • 파일 및 스트림 복사를 위한 간단한 유틸리티 메소드

 

주요 메소드

메소드 설명
copy 파일 복사. return 복사 된 바이트 수
copyToByteArray return 복사된 새 바이트 배열 (빈 배열 가능)
copyToString return 복사된 문자열 (빈 배열 가능)

참조

소스 코드: gofnrk.tistory.com/88

URL 클래스: hackeen.tistory.com/18

RestTemplate: docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

ResponseEntity: devlog-wjdrbs96.tistory.com/182

FileCopyUtils: docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/FileCopyUtils.html

반응형