반응형
추가 개발 건에 파일 다운로드 기능을 만들어야 해서 관련 코드를 찾아보았다.
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
반응형
'Develop > Java' 카테고리의 다른 글
웹 어플리케이션에 대해 (0) | 2021.03.25 |
---|---|
[Java] MessageFormat (0) | 2021.03.22 |
[Java Stream] 자바 스트림 (0) | 2021.03.17 |
[Jackson] com.fasterxml.jackson.core.JsonParseException 에러 (0) | 2021.03.09 |
[Ant] Unable to find a javac compiler 에러 (0) | 2021.03.05 |