본문 바로가기
ERROR FIX

NCP Content-Type 변경

by ppirae 2023. 8. 17.

NCP는 S3 sdk로 업로드 가능하다

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);

단일 객체로 업로드 하였더니 해결됨

댓글