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>
Multipart File to File
public static File convertMultiPartToFile(MultipartFile file) throws IOException {
File convFile = new File(file.getOriginalFilename());
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
return convFile;
}
Spring Boot REST Controller (StorageController)
@RestController
@RequestMapping("/storage")
public class StorageController {
@Autowired
StorageService storageService;
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String upload(@RequestParam("file") MultipartFile file,
@RequestParam("fileName") String fileName) {
storageService.store(file, fileName);
return "Upload success";
}
}
}
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(MultipartFile multipartFile, String fileName) throws Exception {
String fileUrl = "";
try {
File file = Utils.convertMultiPartToFile(multipartFile); // refer the above code for this method
buildAmazonS3Client(defaultRegion, defaultEndpointUrl);
fileUrl = defaultEndpointUrl + "/" + bucketName + "/" + fileName;
// once the file is uploaded successfully then update the same url in the user table
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 "upload failed!";
}
return "upload success!");
}
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