package net.gepafin.tendermanagement.service.impl; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.*; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Optional; @Service public class AmazonS3ServiceImpl implements AmazonS3Service { @Autowired private AmazonS3 amazonS3; @Autowired private Environment environment; @Value("${aws.s3.bucket.name}") private String bucketName; @Value("${aws.s3.url}") private String s3Url; @Override public String upload(String fileName, String s3Folder, MultipartFile file) throws IOException { // String path = bucketName+"/"+s3Folder; String path = s3Folder +"/"+fileName; InputStream inputStream = file.getInputStream(); ObjectMetadata objectMetadata = new ObjectMetadata(); Map metadata = new HashMap<>(); metadata.put("Content-Type", file.getContentType()); metadata.put("Content-Length", String.valueOf(file.getSize())); Optional> optionalMetaData = Optional.of(metadata); optionalMetaData.ifPresent(map -> { if (!map.isEmpty()) { map.forEach(objectMetadata::addUserMetadata); } }); if(Boolean.FALSE.equals(isTestProfileActivated())) { amazonS3.putObject(bucketName, path, inputStream, objectMetadata); } return s3Url + s3Folder +"/"+ fileName; } @Override public Boolean delete(String s3Folder, String fileName) { String path = s3Folder +"/"+fileName; final DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, path); if(Boolean.FALSE.equals(isTestProfileActivated())) { amazonS3.deleteObject(deleteObjectRequest); } return true; } public Boolean isTestProfileActivated() { String[] activeProfiles = environment.getActiveProfiles(); return Arrays.stream(activeProfiles).anyMatch("test"::equals); } @Override public InputStream getFile(String s3Folder, String filePath) throws IOException { try { String path = s3Folder +"/"+filePath; GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, path); S3Object s3Object = amazonS3.getObject(getObjectRequest); return s3Object.getObjectContent(); } catch (AmazonS3Exception e) { throw new IOException("Error getting file from Amazon S3", e); } } @Override public UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file) { String extension = FilenameUtils.getExtension(file.getOriginalFilename()); String fileName = org.springframework.util.StringUtils.cleanPath(file.getOriginalFilename()); String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); firstNameContain+=Utils.randomKey(5); fileName = (firstNameContain + "." + extension); try { String filepath = upload(fileName, s3Folder, file); return UploadFileOnAmazonS3Response.builder().fileName(fileName).filePath(filepath).build(); } catch (Exception e) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); } } }