I am trying to upload images and PDF on AWS S3 using my Spring Boot app. They are getting uploaded in corrupt format without any error. Text files are uploaded successfully.
JavaScript
x
public String uploadDocumentToS3(String bucketName, MultipartFile file) {
Map<String, String> mimeTypes = new HashMap<String, String>();
mimeTypes.put("jpeg", "image/jpeg");
mimeTypes.put("jpg", "image/jpeg");
mimeTypes.put("png", "image/png");
mimeTypes.put("pdf", "application/pdf");
mimeTypes.put("txt", "text/plain");
String fileExtension = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
LOGGER.info("File Extension " + fileExtension + " MIME " + mimeTypes.get(fileExtension));
final String s3FileName = LocalDateTime.now() + "_" + file.getOriginalFilename();
LOGGER.info("Uploading file on S3 with name= " + s3FileName);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(mimeTypes.get(fileExtension));
metadata.setContentLength(file.getSize());
metadata.addUserMetadata("title", "Business Onboarding Doc");
PutObjectRequest request;
try {
request = new PutObjectRequest(bucketName, s3FileName, file.getInputStream(), metadata);
amazonS3.putObject(request);
} catch (Exception e) {
LOGGER.error("Error while uploading S3 file using InputStream " + e.getLocalizedMessage());
}
return s3FileName;
}
Below is the dependencies we have used.
JavaScript
compile group: 'com.amazonaws', name: 'aws-java-sdk', version: '1.11.946'
Advertisement
Answer
My code works fine. The issue was in the AWS API Gateway. We need to add '*/*'
in the Binary Media Types to make file uploading work.
For Reference: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-configure-with-console.html