Skip to content

Commit

Permalink
feat: 파일 업로드 에러 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
km2535 committed Dec 5, 2024
1 parent 899ac6e commit a887594
Show file tree
Hide file tree
Showing 11 changed files with 86 additions and 52 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.badminton.api.application.clubImage;

import java.io.IOException;
import java.util.Objects;
import java.util.UUID;

Expand All @@ -10,7 +11,9 @@
import org.springframework.transaction.annotation.Transactional;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
@RequiredArgsConstructor
public class ClubImageFacade {
Expand All @@ -21,15 +24,23 @@ public class ClubImageFacade {

@Transactional
public String saveImage(ImageUploadRequest request) {
// uuid 객체 생성
String uuid = UUID.randomUUID().toString();
String extension = getFileExtension(Objects.requireNonNull(request.multipartFile().getOriginalFilename()));
try {
byte[] byteFile = request.multipartFile().getBytes();

// 비동기 처리
eventPublisher.publishEvent(new ClubImageEvent(request.multipartFile(), uuid));
String originalNam = request.multipartFile().getOriginalFilename();
// uuid 객체 생성
String uuid = UUID.randomUUID().toString();
String extension = getFileExtension(Objects.requireNonNull(originalNam));

// url 만드는 곳으로 전달
return preReturnUrl(uuid, extension);
// 비동기 처리
eventPublisher.publishEvent(new ClubImageEvent(byteFile, originalNam, uuid));

// url 만드는 곳으로 전달
return preReturnUrl(uuid, extension);
} catch (IOException e) {
log.info("saveImage : {} ", e);
}
return "실패";
}

private String preReturnUrl(String uuid, String extension) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.badminton.api.application.member;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
Expand Down Expand Up @@ -97,15 +98,23 @@ public Page<MatchResultResponse> getMemberMatchResults(String memberToken, int p

@Transactional
public String saveImage(ImageUploadRequest request) {
// uuid 객체 생성
String uuid = UUID.randomUUID().toString();
String extension = getFileExtension(Objects.requireNonNull(request.multipartFile().getOriginalFilename()));
try {
byte[] byteFile = request.multipartFile().getBytes();

// 비동기 처리
eventPublisher.publishEvent(new MemberImageEvent(request.multipartFile(), uuid));
String originalNam = request.multipartFile().getOriginalFilename();
// uuid 객체 생성
String uuid = UUID.randomUUID().toString();
String extension = getFileExtension(Objects.requireNonNull(originalNam));

// url 만드는 곳으로 전달
return preReturnUrl(uuid, extension);
// 비동기 처리
eventPublisher.publishEvent(new MemberImageEvent(byteFile, originalNam, uuid));

// url 만드는 곳으로 전달
return preReturnUrl(uuid, extension);
} catch (IOException e) {
log.info("saveImage : {} ", e);
}
return "실패";
}

private String preReturnUrl(String uuid, String extension) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package org.badminton.api.aws.s3.event.clubImage;

import org.springframework.web.multipart.MultipartFile;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class ClubImageEvent {
private final MultipartFile multipartFile;
private final byte[] byteFile;
private final String originalFilename;
private final String uuid;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ public class ClubImageEventHandler {
@Async
@TransactionalEventListener
public void convertAndSaveImage(ClubImageEvent clubImageEvent) {
clubImageService.uploadFile(clubImageEvent.getMultipartFile(), clubImageEvent.getUuid());
log.info("ClubImageEventHandler : {} ", clubImageEvent);
clubImageService.uploadFile(
clubImageEvent.getByteFile(),
clubImageEvent.getOriginalFilename(),
clubImageEvent.getUuid()
);
log.info("ClubImageEventHandler 후 : {} ", clubImageEvent);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package org.badminton.api.aws.s3.event.memeber;

import org.springframework.web.multipart.MultipartFile;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class MemberImageEvent {
private final MultipartFile multipartFile;
private final byte[] byteFile;
private final String originalFilename;
private final String uuid;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import org.springframework.transaction.event.TransactionalEventListener;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
@RequiredArgsConstructor
public class MemberImageEventHandler {
Expand All @@ -15,9 +17,13 @@ public class MemberImageEventHandler {
@Async
@TransactionalEventListener
public void convertAndSaveImage(MemberImageEvent memberImageEvent) {
log.info("memberException : {} ", memberImageEvent);
memberProfileImageService.uploadFile(
memberImageEvent.getMultipartFile(),
memberImageEvent.getByteFile(),
memberImageEvent.getOriginalFilename(),
memberImageEvent.getUuid()
);
log.info("memberException 후 : {} ", memberImageEvent);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Objects;

import org.badminton.api.common.exception.EmptyFileException;
import org.badminton.api.common.exception.FileSizeOverException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.multipart.MultipartFile;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.CannedAccessControlList;
Expand All @@ -33,29 +31,34 @@ public abstract class AbstractFileUploadService implements ImageService {
private static final String S3_URL_PREFIX = "https://badminton-team.s3.ap-northeast-2.amazonaws.com";
private static final String CLOUDFRONT_URL_PREFIX = "https://d36om9pjoifd2y.cloudfront.net";

public String uploadFile(MultipartFile uploadFile, String uuid) {
if (uploadFile.getSize() > MAX_FILE_SIZE) {
throw new FileSizeOverException(uploadFile.getSize());
public String uploadFile(byte[] byteFiles, String fileName, String uuid) {
if (byteFiles.length > MAX_FILE_SIZE) {
throw new FileSizeOverException(byteFiles.length);
}
log.info("upload : {}", fileName);
// if (uploadFile.isEmpty() || Objects.isNull(uploadFile.getOriginalFilename())) {
// throw new EmptyFileException();
// }
log.info("upload validate 이후 : {}", fileName);

if (uploadFile.isEmpty() || Objects.isNull(uploadFile.getOriginalFilename())) {
throw new EmptyFileException();
}
try {
String fileExtension = getFileExtension(uploadFile.getOriginalFilename());
byte[] processedImage = processImage(uploadFile, fileExtension);
String fileExtension = getFileExtension(fileName);
byte[] processedImage = processImage(byteFiles, fileExtension);
log.info(" try processedImage : {}", processedImage);

String newFileExtension = determineNewFileExtension(fileExtension);
String fileName = makeFileName(newFileExtension, uuid);
String newFileName = makeFileName(newFileExtension, uuid);

ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(processedImage.length);
objectMetadata.setContentType(CONTENT_TYPE);

s3Client.putObject(new PutObjectRequest(bucket, fileName,
s3Client.putObject(new PutObjectRequest(bucket, newFileName,
new ByteArrayInputStream(processedImage), objectMetadata)
.withCannedAcl(CannedAccessControlList.PublicRead));
log.info(" s3Client 실행 : {}", newFileName);

return toCloudFrontUrl(s3Client.getUrl(bucket, fileName).toString());
return toCloudFrontUrl(s3Client.getUrl(bucket, newFileName).toString());

} catch (IOException e) {
throw new EmptyFileException();
Expand All @@ -78,11 +81,11 @@ private String toCloudFrontUrl(String originUrl) {
}
}

private byte[] processImage(MultipartFile file, String extension) throws IOException {
private byte[] processImage(byte[] bytesFile, String extension) throws IOException {
if (WEBP.equalsIgnoreCase(extension) || AVIF.equalsIgnoreCase(extension)) {
return file.getBytes();
return bytesFile;
}
return imageConversionService.convertToWebP(file);
return imageConversionService.convertToWebP(bytesFile);
}

private String determineNewFileExtension(String extension) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.badminton.api.aws.s3.service;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.amazonaws.services.s3.AmazonS3;

Expand All @@ -13,8 +12,8 @@ public ClubImageService(AmazonS3 s3Client, ImageConversionService imageConversio
}

@Override
public String uploadFile(MultipartFile file, String uuid) {
return super.uploadFile(file, uuid);
public String uploadFile(byte[] byteFiles, String fileName, String uuid) {
return super.uploadFile(byteFiles, fileName, uuid);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package org.badminton.api.aws.s3.service;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.badminton.api.common.exception.EmptyFileException;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.sksamuel.scrimage.ImmutableImage;
import com.sksamuel.scrimage.metadata.ImageMetadata;
Expand All @@ -18,20 +18,25 @@
@Service
public class ImageConversionService {

public byte[] convertToWebP(MultipartFile file) {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
InputStream inputStream = file.getInputStream()) {
public byte[] convertToWebP(byte[] fileName) {
log.info("try 시작 전 :{}", fileName);
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {

log.info("try 시작 :{}", fileName);

InputStream inputStream = new ByteArrayInputStream(fileName);

ImmutableImage image = ImmutableImage.loader().fromStream(inputStream);
WebpWriter writer = WebpWriter.DEFAULT;

ImageMetadata metadata = ImageMetadata.empty;

writer.write(image, metadata, outputStream);
log.info("writer.write 후");

return outputStream.toByteArray();
} catch (IOException exception) {
throw new EmptyFileException(exception);
}
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package org.badminton.api.aws.s3.service;

import org.springframework.web.multipart.MultipartFile;

public interface ImageService {
String uploadFile(MultipartFile file, String uuid);
String uploadFile(byte[] byteFiles, String fileName, String uuid);

String makeFileName(String newFileExtension, String uuid);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.badminton.api.aws.s3.service;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.amazonaws.services.s3.AmazonS3;

Expand All @@ -13,8 +12,8 @@ public MemberProfileImageService(AmazonS3 s3Client, ImageConversionService image
}

@Override
public String uploadFile(MultipartFile file, String uuid) {
return super.uploadFile(file, uuid);
public String uploadFile(byte[] byteFiles, String fileName, String uuid) {
return super.uploadFile(byteFiles, fileName, uuid);
}

@Override
Expand Down

0 comments on commit a887594

Please sign in to comment.