
1. NAVER CLOUD PLATFORM 오브젝트 스토리지에 파일을 올릴 때 S3 Browser 를 사용해서 올림
2. 테스트를 해보니 S3 Browser 사용해서 올리면 메타 데이터에
추가로 x-amz-meta-s3b-last-modified 와 x-amz-meta-sha256 이라는 값이 추가 생성됨
3. 이로 인해 S3 Browser 를 이용해서 올린 파일들은 Content-Type이 application/octet-stream 으로 변경되면서
Content-Length 가 보이지 않는 것으로 확인
4. 확인 결과 파일을 업로드 할 때 s3 Browser 나 API로 파일을 업로드 할 때와 Ncloud Object Storage에 직접 업로드 할 때
Request TEST 시 MIME type 에 따라 Contect-type 이 다르게 올라가는 현상이 있음
Content-type이 변경되는 원인
-> 업로드 하는 파일의 MIME type을 잘 알지 못하는 확장자에 대해서 Content-Type을 application/octet-stream으로 임의 변경
해결방법
-> 업로드 하는 파일의 MIME type에 대해 content-Type을 지정해 주는 것으로 해결됨
삽질한 점
// 기존 s3 멀티파트 업로드 코드
long contentLength = file.length();
long partSize = 10 * 1024 * 1024;
try {
// initialize and get upload ID
InitiateMultipartUploadResult initiateMultipartUploadResult = s3.initiateMultipartUpload(new InitiateMultipartUploadRequest(ncpAppBucketName, objectName));
String uploadId = initiateMultipartUploadResult.getUploadId();
// upload parts
List<PartETag> partETagList = new ArrayList<PartETag>();
long fileOffset = 0;
for (int i = 1; fileOffset < contentLength; i++) {
partSize = Math.min(partSize, (contentLength - fileOffset));
UploadPartRequest uploadPartRequest = new UploadPartRequest()
.withBucketName(ncpAppBucketName)
.withKey(objectName)
.withUploadId(uploadId)
.withPartNumber(i)
.withFile(file)
.withFileOffset(fileOffset)
.withPartSize(partSize)
.withObjectMetadata(objectMetadata);
UploadPartResult uploadPartResult = s3.uploadPart(uploadPartRequest);
partETagList.add(uploadPartResult.getPartETag());
fileOffset += partSize;
}
// abort
// s3.abortMultipartUpload(new AbortMultipartUploadRequest(bucketName, objectName, uploadId));
// complete
CompleteMultipartUploadResult completeMultipartUploadResult = s3.completeMultipartUpload(new CompleteMultipartUploadRequest(ncpAppBucketName, objectName, uploadId, partETagList));
logger.info(" >>> completeMultipartUploadResult() ::: " + completeMultipartUploadResult);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
기존 multipartUpload 방식에서는 .withObjectMetadata(objectMetadata);
이 코드가 적용이 안되어 Content-Type이 바뀌질 않음
File file = new File(filePath);
String ext = FilenameUtils.getExtension(file.getName());
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
ObjectMetadata objectMetadata = new ObjectMetadata();
if(ext.equalsIgnoreCase("APK")) {
objectMetadata.setContentType("application/vnd.android.package-archive");
objectMetadata.setBucketKeyEnabled(true);
}
try {
s3.putObject(bucketName, objectName, new FileInputStream(file), objectMetadata);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
} catch(FileNotFoundException e) {
e.printStackTrace();
}
Java Code에서 MIME type 추가 - Upload 코드에서 아래와 같이 ObjectMetadata를 추가
s3.putObject(bucketName, objectName, new FileInputStream(file), objectMetadata);
단일 객체로 업로드 하였더니 해결됨
'ERROR FIX' 카테고리의 다른 글
스프링 CORS 처리 (+스프링 클라우드 게이트웨이) (1) | 2023.11.05 |
---|---|
AmazonS3Client - No content length specified for stream data. 경고 WARN (0) | 2023.08.21 |
[IntelliJ][SVN] is out of date svn: E160028 (0) | 2023.03.06 |
인텔리제이 톰캣 서버 설치와 연결 (0) | 2023.02.21 |
[IntelliJ] Mac mouse click error 인텔리제이 마우스 클릭 에러 (0) | 2022.12.22 |
댓글