TIL 2021-07-20

한꼬북·2021년 7월 20일
0

TIL

목록 보기
1/5
post-thumbnail

spring boot로 s3 연동해서 비동기로 fileUpload 하려고 함!
먼저 동기로 postman 이용해서 확인 후,
비동기로 바꿔서 s3 업로드가 되는지 확인 하려고 실행 했는데 !
s3에 업로드 되고 db에도 저장이 잘 됐다 근데,,? 🙄

갑자기 떠오르는 Console에 WARN 로그,,
아,, 업로드 할 파일의 길이를 정해서 업로드 하라고 한다
그렇게 하지 않으면 out of memory error 발생시킬 수 있다고,, 😨

기존

@Override
public String uploadFile(MultipartFile file) {
	String fileName = System.nanoTime()+StringUtils.cleanPath(file.getOriginalFilename());
	try {
		s3Client.putObject(
			new PutObjectRequest(
				bucket,
				fileName,
				file.getInputStream(),
				null)
			.withCannedAcl(
				CannedAccessControlList.PublicRead)
		);
	} catch (IOException e) {
		throw new FileUploadException(ExceptionEnum.FILEUPLOAD_EXCEPTION);
	}
	return s3Client.getUrl(bucket, fileName).toString();
	}

수정

@Override
public String uploadFile(MultipartFile file) {
	String fileName = System.nanoTime()+StringUtils.cleanPath(file.getOriginalFilename());
	try {
		InputStream is = file.getInputStream();
		Long contentLength = Long.valueOf(IOUtils.toByteArray(is).length);
		ObjectMetadata metaDate = new ObjectMetadata();
		metaDate.setContentLength(contentLength);
		s3Client.putObject(
			new PutObjectRequest(
				bucket,
				fileName,
				file.getInputStream(),
				metaDate)
			.withCannedAcl(
				CannedAccessControlList.PublicRead)
		);
	} catch (IOException e) {
		throw new FileUploadException(ExceptionEnum.FILEUPLOAD_EXCEPTION);
	}
	return s3Client.getUrl(bucket, fileName).toString();
}
  1. inputStream을 초기화
  2. IOUtils.toByteArray 메소드로 inputStream의 byte[] 초기화
  3. byte[] 타입을 Long.valueOf 메소드로 Long 타입으로 형변환
  4. ObjectMetadata 객체 생성 후 setContentLength 메소드로 초기화
  5. PutObjectRequest 객체를 new로 생성할 때 null값을 초기화 시킨 ObjectMetadata 넣어주기

이렇게 수정하니 편_안하게 업로드 잘 된다,
아 그리고 ! 비동기 ajax로 file 보낼 때 multipart/form-data;charset=UTF-8로 보내는거 잊지 말기😋

profile
오히려 좋아, 자 가보자고!

0개의 댓글