Skip to content

Instantly share code, notes, and snippets.

@vaibhavdes
Last active November 15, 2020 12:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vaibhavdes/a411669aa24c589c8a841e9e33458380 to your computer and use it in GitHub Desktop.
Save vaibhavdes/a411669aa24c589c8a841e9e33458380 to your computer and use it in GitHub Desktop.
Java - AWS S3 Basic Functionality
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
import com.amazonaws.util.IOUtils;
@Service
public class S3OperationImpl {
private Logger LOGGER = LoggerFactory.getLogger(S3OperationImpl.class);
@Autowired
AmazonS3 s3client;
// OBJECT LEVEL API
@Override
public void uploadSingleFile(String bucketName, String fileName, MultipartFile file) {
LOGGER.info(" --- Uploading a new file to S3 Bucket --- ");
if (s3client.doesBucketExistV2(bucketName)) {
try {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(file.getSize());
s3client.putObject(new PutObjectRequest(bucketName, fileName, file.getInputStream(), metadata));
} catch (IOException e) {
LOGGER.error("IOException: " + e.getMessage());
} catch (AmazonServiceException a) {
LOGGER.info("Error Message: " + a.getMessage());
LOGGER.info("HTTP Status Code: " + a.getStatusCode());
LOGGER.info("AWS Error Code: " + a.getErrorCode());
LOGGER.info("Error Type: " + a.getErrorType());
LOGGER.info("Request ID: " + a.getRequestId());
}
}
}
@Override
public void uploadMultipleFile(String bucketName, MultipartFile[] files) {
LOGGER.info(" --- Uploading a new files to S3 Bucket --- ");
try {
for (MultipartFile file : files) {
String fileName = file.getOriginalFilename();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(file.getSize());
s3client.putObject(new PutObjectRequest(bucketName, fileName, file.getInputStream(), metadata));
}
} catch (IOException e) {
LOGGER.error("IOException: " + e.getMessage());
} catch (AmazonServiceException a) {
LOGGER.info("Error Message: " + a.getMessage());
LOGGER.info("HTTP Status Code: " + a.getStatusCode());
LOGGER.info("AWS Error Code: " + a.getErrorCode());
LOGGER.info("Error Type: " + a.getErrorType());
LOGGER.info("Request ID: " + a.getRequestId());
}
}
@Override
public void uploadFileWithProgressBar(String bucketName, String fileName, MultipartFile file) {
LOGGER.info(" --- Uploading a new file to S3 Bucket --- ");
if (!s3client.doesBucketExistV2(bucketName))
bucket.createBucket(bucketName);
try {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(file.getSize());
// Track Upload Progress
TransferManager tm = TransferManagerBuilder.standard().withS3Client(s3client).build();
PutObjectRequest request = new PutObjectRequest(bucketName, fileName, file.getInputStream(), metadata);
// To receive notifications when bytes are transferred, add a
// ProgressListener to your request.
request.setGeneralProgressListener(new ProgressListener() {
public void progressChanged(ProgressEvent progressEvent) {
System.out.println("Transferred bytes: " + progressEvent.getBytesTransferred());
}
});
// TransferManager processes all transfers asynchronously,
// so this call returns immediately.
Upload upload = tm.upload(request);
// Optionally, you can wait for the upload to finish before continuing.
upload.waitForCompletion();
} catch (IOException e) {
LOGGER.error("IOException: " + e.getMessage());
} catch (AmazonServiceException a) {
LOGGER.info("Error Message: " + a.getMessage());
LOGGER.info("HTTP Status Code: " + a.getStatusCode());
LOGGER.info("AWS Error Code: " + a.getErrorCode());
LOGGER.info("Error Type: " + a.getErrorType());
LOGGER.info("Request ID: " + a.getRequestId());
} catch (AmazonClientException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void deleteFile(String bucketName, String key) {
LOGGER.info(" --- Deleting file from bucket --- ");
if (s3client.doesBucketExistV2(bucketName)) {
s3client.deleteObject(bucketName, key);
}
}
@Override
public byte[] downloadFile(String key, String bucketName) {
try {
if (s3client.doesBucketExistV2(bucketName)) {
LOGGER.info(" --- Downloading an file from bucket --- ");
S3Object obj = s3client.getObject(new GetObjectRequest(bucketName, key));
S3ObjectInputStream stream = obj.getObjectContent();
LOGGER.info("Content-Type: " + obj.getObjectMetadata().getContentType());
byte[] content = IOUtils.toByteArray(stream);
obj.close();
return content;
}
} catch (AmazonServiceException a) {
LOGGER.info("Error Message: " + a.getMessage());
LOGGER.info("HTTP Status Code: " + a.getStatusCode());
LOGGER.info("AWS Error Code: " + a.getErrorCode());
LOGGER.info("Error Type: " + a.getErrorType());
LOGGER.info("Request ID: " + a.getRequestId());
}
return null;
}
@Override
public String downloadFileWithPresignedExpiryURL(String key, String bucketName) {
try {
// Set the presigned URL to expire after one hour.
java.util.Date expiration = new java.util.Date();
long expTimeMillis = expiration.getTime();
expTimeMillis += 1000 * 60 * 60;
expiration.setTime(expTimeMillis);
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key)
.withMethod(HttpMethod.GET).withExpiration(expiration);
URL url = s3client.generatePresignedUrl(generatePresignedUrlRequest);
return url.toString();
} catch (AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it, so it returned an error response.
e.printStackTrace();
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
e.printStackTrace();
}
return null;
}
public void copyFile(String srcBucket, String srcFileName, String destBucket, String destFileName) {
LOGGER.info(" --- Copying a File to Another S3 Bucket --- ");
if (s3client.doesBucketExistV2(srcBucket)) {
if (s3client.doesBucketExistV2(destBucket))
s3client.copyObject(srcBucket, srcFileName, destBucket, destFileName);
}
}
// BUCKET LEVEL API
public List<Bucket> getAllBuckets() {
LOGGER.info(" --- Listing Buckets Request --- ");
return s3client.listBuckets();
}
public Bucket createBucket(String bucketName) {
LOGGER.info(" --- Creating bucket " + bucketName + " --- ");
return s3client.createBucket(bucketName);
}
public void deleteBucket(String bucketName) {
LOGGER.info(" --- Bucket Delete Request " + bucketName + " --- ");
s3client.deleteBucket(bucketName);
}
public ObjectListing getObjects(String bucketName) {
LOGGER.info(" --- Bucket Object Information " + bucketName + " --- ");
if (s3client.doesBucketExistV2(bucketName)) {
ObjectListing objectListing = s3client.listObjects(new ListObjectsRequest().withBucketName(bucketName));
// Mutiple Filter for search
// .withPrefix("thumbnail"));
return objectListing;
}
return null;
}
public Boolean checkBucket(String bucketName) {
LOGGER.info(" --- Checking Bucket Existence " + bucketName + " --- ");
if (s3client.doesBucketExistV2(bucketName))
return true;
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment