Upload Video File in Amazon S3 Storage Using Java
package com.aws.momo.project.util;

import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.Date;

import javax.annotation.PostConstruct;
import javax.imageio.ImageIO;
import javax.security.auth.message.callback.PrivateKeyCallback.Request;

import org.apache.http.HttpRequest;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.web.multipart.MultipartFile;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.util.Base64;
import com.aws.momo.project.controller.MomoUsersController;

@Service
public class AmazonClient {
	private static Logger logger = LoggerFactory.getLogger(AmazonClient.class);

	private AmazonS3 s3client;

	@Value("${amazonProperties.videoUrl}")
	private String videoUrl;
	@Value("${amazonProperties.audioUrl}")
	private String audioUrl;
	@Value("${amazonProperties.thumbUrl}")
	private String thumbUrl;
	@Value("${amazonProperties.localPath}")
	private String localPath;
	@Value("${amazonProperties.serverPath}")
	private String serverPath;
	@Value("${amazonProperties.secretKey}")
	private String secretKey;
	@Value("${amazonProperties.accessKey}")
	private String accessKey;
	@Value("${amazonProperties.bucketNameVideo}")
	private String bucketNameVideo;
	@Value("${amazonProperties.bucketNameSound}")
	private String bucketNameSound;
	@Value("${amazonProperties.bucketNameThumb}")
	private String bucketNameThumb;
	@Value("${amazonProperties.bucketName}")
	private String bucketName;

	@SuppressWarnings("deprecation")
	@PostConstruct
	private void initializeAmazon() {
		AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
		this.s3client = new AmazonS3Client(credentials);
	}

	private File convertMultiPartToFile(MultipartFile file) throws IOException {

		File convFile = new File(file.getOriginalFilename());
		FileOutputStream fos = new FileOutputStream(serverPath + convFile);
		fos.write(file.getBytes());
		fos.close();
		return convFile;
	}

	private String generateFileName(MultipartFile multiPart) throws IOException {
		return new Date().getTime() + "-" + multiPart.getOriginalFilename().replace(" ", "_");
	}

	public String uploadVideoTos3bucket(MultipartFile file) {

		logger.info("uploadVideoTos3bucket");
		String fileUrl = "";
		try {

			logger.info("file.getOriginalFilename() " + file.getOriginalFilename());
			logger.info("file.getContentType()" + file.getContentType());
			logger.info("file.getInputStream() " + file.getInputStream());
			logger.info("file.toString() " + file.toString());
			logger.info("file.getSize() " + file.getSize());
			logger.info("file.getBytes() " + file.getBytes());
			logger.info("file.hashCode() " + file.hashCode());
			logger.info("file.getClass() " + file.getClass());
			logger.info("file.isEmpty() " + file.isEmpty());

			InputStream is = file.getInputStream();
			String keyName = generateFileName(file);

			logger.info("keyName" + keyName);

			logger.info("Uploading a new object to S3 from a uploadVideoTos3bucket\n");
			ObjectMetadata meta = new ObjectMetadata();
			meta.setContentType("video/mp4");
			meta.setContentLength(file.getSize());
			s3client.putObject(new PutObjectRequest(bucketNameVideo, keyName, is, meta)
					.withCannedAcl(CannedAccessControlList.PublicRead));

			logger.info("************************************");

			fileUrl = videoUrl + keyName;

		} catch (AmazonServiceException ase) {
			logger.info("Caught an AmazonServiceException, which " + "means your request made it "
					+ "to Amazon S3, but was rejected with an error response" + " for some reason.");
			logger.info("Error Message:    " + ase.getMessage());
			logger.info("HTTP Status Code: " + ase.getStatusCode());
			logger.info("AWS Error Code:   " + ase.getErrorCode());
			logger.info("Error Type:       " + ase.getErrorType());
			logger.info("Request ID:       " + ase.getRequestId());

		} catch (AmazonClientException ace) {

			logger.info("Caught an AmazonClientException, which " + "means the client encountered "
					+ "an internal error while trying to " + "communicate with S3, "
					+ "such as not being able to access the network.");
			logger.info("Error Message: " + ace.getMessage());
		} catch (IOException e) {
			logger.info("Error Message: " + e.getMessage());
		}

		return fileUrl;
	}

	


}
Application.yml
amazonProperties:
  videoUrl: 
  audioUrl: 
  thumbUrl: 
  localPath: 
  serverPath: 
   accessKey: 
  secretKey: 
  bucketNameVideo: 
  bucketNameSound:  
  bucketNameThumb:
  bucketName: