REST API to upload Multipart image file to AWS S3 Bucket
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