Pegar o nome do arquivo upado no S3. O nome dele será o instante atual em milissegundos + a sua extension
Para enviar o objeto para O S3 com MultiPartFile usaremos o InputStream.
Pegar o contentType do arquivo
E colocar para retornar o método uploadFile() (que criaremos abaixo)
@ServicepublicclassS3Service {privatestaticLogger LOG =LoggerFactory.getLogger(S3Service.class);//componente do SDK Amazon @AutowiredprivateAmazonS3 s3client;//pegando nome do do bucket do properties @Value("${s3.bucket}")privateString bucketName;//agora o método retorna URL e recebe um MultiPartFilepublicURLuploadFile(MultiPartFile file) {try {String originalName =file.getOriginalFilename();//pegando extensao do arquivo com o apache IOString extension =FilenameUtils.getExtension(originalName);//gerando nome padrão pros arquivos (correspodente ao instante que ele foi//upadoString fileName =Instant.now().toDate().getTime() +"."+ extension;//isso pode gerar uma IOExceptionInputStream is =file.getInputStream();//é um jpg/png? ele nos dirá issoString contentType =file.getContentType();//essa função chama o upload no S3 e retorna a URLreturnuploadFile(is, fileName, contentType); }//deixa só esse catch porque pode ter algum//erro de digitação no inputcatch (IOException e) {thrownewIllegalArgumentException(e.getMessage()); } }privateURLuploadFile(InputStream is,String fileName,String contentType) {ObjectMetadata meta =newObjectMetadata();meta.setContentType(contentType);//aqui ele faz o upload no s3 pra gentes3client.putObject(bucketName, fileName, is, meta);//para retornar URL no bucket do AWSreturns3client.getUrl(bucketName, fileName); }}
Lembrar de Injetar no S3Service no ProductService
public UriDto uploadFile(MultiPartFile file) {
URL url = s3Service.uploadFile(file);
return new UriDto(url.toString());
}