Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package swyp_8th.bungmakase_backend.service;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Value;

Expand All @@ -31,19 +33,72 @@ public class FileStorageService {

// 파일 업로드 및 URL 반환
public String uploadFile(MultipartFile file) {
String fileName = file.getOriginalFilename();
// String fileName = file.getOriginalFilename();
//
// try {
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setContentLength(file.getSize()); // 파일 크기 설정
// metadata.setContentType(file.getContentType()); // MIME 타입 설정
//
// amazonS3.putObject(
// new PutObjectRequest(bucket, fileName, file.getInputStream(), metadata) // metadata 적용
// .withCannedAcl(CannedAccessControlList.PublicRead) // 퍼블릭 읽기 권한 부여
// );
//
// return amazonS3.getUrl(bucket, fileName).toString();
// } catch (IOException e) {
// throw new RuntimeException("파일 업로드 중 오류가 발생했습니다.", e);
// }

try {
String fileName = file.getOriginalFilename();
long fileSize = file.getSize(); // 파일 크기 확인
InputStream inputStream = file.getInputStream();

// 파일 크기가 5MB 이하일 경우, 일반 업로드로 처리
if (fileSize <= 5 * 1024 * 1024) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(fileSize);
metadata.setContentType(file.getContentType());

amazonS3.putObject(new PutObjectRequest(bucket, fileName, inputStream, metadata)
.withCannedAcl(CannedAccessControlList.PublicRead)); // 퍼블릭 읽기 권한 부여

return amazonS3.getUrl(bucket, fileName).toString();
}

// 멀티파트 업로드 시작
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(file.getSize());
metadata.setContentType(file.getContentType());

amazonS3.putObject(
new PutObjectRequest(bucket, fileName, file.getInputStream(), null)
.withCannedAcl(CannedAccessControlList.PublicRead) // 퍼블릭 읽기 권한 부여
);
InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucket, fileName)
.withObjectMetadata(metadata);
InitiateMultipartUploadResult initResponse = amazonS3.initiateMultipartUpload(initRequest);

byte[] buffer = new byte[5 * 1024 * 1024]; // 5MB 버퍼
List<PartETag> partETags = new ArrayList<>();
int partNumber = 1;

int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucket)
.withKey(fileName)
.withUploadId(initResponse.getUploadId())
.withPartNumber(partNumber++)
.withInputStream(new ByteArrayInputStream(buffer, 0, bytesRead))
.withPartSize(bytesRead);

partETags.add(amazonS3.uploadPart(uploadRequest).getPartETag());
}

// 업로드 완료 요청
CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(
bucket, fileName, initResponse.getUploadId(), partETags);
amazonS3.completeMultipartUpload(completeRequest);

return amazonS3.getUrl(bucket, fileName).toString();

} catch (IOException e) {
throw new RuntimeException("파일 업로드 중 오류가 발생했습니다.", e);
}
Expand Down
6 changes: 6 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
spring:
servlet:
multipart:
enabled: true
max-file-size: 50MB
max-request-size: 50MB

datasource:
url: jdbc:mysql://211.188.61.117:3306/bungmakase?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&createDatabaseIfNotExist=true&autoReconnect=true
username: bungmakase
Expand Down