In this article we are going to see how to upload base64 image to AWS s3 bucket.
Table of Contents
Dependency
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>1.11.1030</version> </dependency>
Base64 String to Image File
public static File getImageFromBase64(String base64String, String fileName) {
String[] strings = base64String.split(",");
String extension;
switch (strings[0]) { // check image's extension
case "data:image/jpeg;base64":
extension = "jpeg";
break;
case "data:image/png;base64":
extension = "png";
break;
default: // should write cases for more images types
extension = "jpg";
break;
}
// convert base64 string to binary data
byte[] data = DatatypeConverter.parseBase64Binary(strings[1]);
File file = new File(fileName + extension);
try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file))) {
outputStream.write(data);
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
Spring Boot REST Controller (StorageController)
@RestController
@RequestMapping("/storage")
public class StorageController {
@Autowired
StorageService storageService;
@PostMapping("/upload")
public String upload(@RequestBody UploadBean uploadBean) {
storageService.store(uploadBean);
return "Upload Success!";
}
}
UploadBean
public class UploadBean {
private String image;
private String name;
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
StorageService
import java.io.File;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.mirthbees.stepsrank.bean.ProfileUploadBean;
import com.mirthbees.stepsrank.utility.Utils;
@Service
public class StorageService {
Logger log = LoggerFactory.getLogger(this.getClass().getName());
// @Autowired
private AmazonS3 s3client;
private static String defaultRegion = "ap-south-1";
@Value("${amazonProperties.endpointUrl.mumbai}")
private String defaultEndpointUrl;
@Value("${amazonProperties.bucketName}")
private String bucketName;
@Value("${amazonProperties.accessKey}")
private String accessKey;
@Value("${amazonProperties.secretKey}")
private String secretKey;
public String store(ProfileUploadBean profileUploadBean) {
String fileName = profileUploadBean.getName();
String fileUrl = "";
try {
File file = Utils.getImageFromBase64(profileUploadBean.getImage(), fileName);
buildAmazonS3Client(defaultRegion, defaultEndpointUrl);
fileUrl = defaultEndpointUrl + "/" + bucketName + "/" + fileName;
uploadFileTos3bucket(fileName, file);
file.delete();
log.info("File uploaded to S3 successfully");
} catch (Exception e) {
log.error("Error while uploadeding the file to S3" + e);
// fileUrl = "exception: "+e.getMessage();
throw e;
}
return fileUrl;
}
private void uploadFileTos3bucket(String fileName, File file) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setCacheControl("51635000");
metadata.setExpirationTime(Utils.getTwentyYearsFromNow());
s3client.putObject(new PutObjectRequest(bucketName, fileName, file)
.withCannedAcl(CannedAccessControlList.PublicRead).withMetadata(metadata));
}
void buildAmazonS3Client(String defaultRegion, String endpoint) {
AWSCredentials credentials = new BasicAWSCredentials(this.accessKey, this.secretKey);
AmazonS3ClientBuilder amazons3ClientBuilder = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, defaultRegion));
this.s3client = amazons3ClientBuilder.build();
}
}
AWS Properties
amazonProperties.endpointUrl.mumbai=https://s3.ap-south-1.amazonaws.com amazonProperties.accessKey=YOUR_ACCESS_KEY amazonProperties.secretKey=YOUR_SECRET_KEY amazonProperties.bucketName=YOUR_BUCKET_NAME
getTwentyYearsFromNow (Utility for AWS Bucket File Cache)
public static Date getTwentyYearsFromNow() {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.YEAR, 20);
Date newDate = c.getTime();
return newDate;
}
Testing & Output
REST API:
http://localhost:8712/storage/upload
Request Body:
{"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAIAAACyr5FlAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAP+lSURBVHhehP11kGTnteaNtqXG4kosSGZmZi5mhmQsZmZmpqws6upusWQxmRlkkWXZktlnfM6Zb2YivrgwN2Li3j/uXbtS1vHMxBdXseL1m7t2ZrX7/eWznmdT30p4suP+9FNf6kkg9SSYeRxEHQfwW37WXp/j9eOe68my3ea8Cx864cs8Cz44Cz59Grh96rtz6rtUVORK5CYII=","name": "Ngdeveloper.png"}