Service

Lembra do S3Service? Nós iremos mexer nele, veja:

No início do try iremos fazer algumas lógicas.

  1. Pegar o nome original do arquivo (originalName)

  2. Pegar a sua extensão (extension)

  3. Pegar o nome do arquivo upado no S3. O nome dele será o instante atual em milissegundos + a sua extension

  4. Para enviar o objeto para O S3 com MultiPartFile usaremos o InputStream.

  5. Pegar o contentType do arquivo

  6. E colocar para retornar o método uploadFile() (que criaremos abaixo)

@Service
public class S3Service {

    private static Logger LOG = LoggerFactory.getLogger(S3Service.class);

    //componente do SDK Amazon
    @Autowired
    private AmazonS3 s3client;

    //pegando nome do do bucket do properties
    @Value("${s3.bucket}")
    private String bucketName;

    //agora o método retorna URL e recebe um MultiPartFile
    public URL uploadFile(MultiPartFile file) {
        try {
            String originalName = file.getOriginalFilename();
            //pegando extensao do arquivo com o apache IO
            String extension = FilenameUtils.getExtension(originalName);
            
            //gerando nome padrão pros arquivos (correspodente ao instante que ele foi
            //upado
            String fileName = Instant.now().toDate().getTime() + "." + extension;
            
            //isso pode gerar uma IOException
            InputStream is = file.getInputStream();
                    
            //é um jpg/png? ele nos dirá isso
            String contentType = file.getContentType();
            
            //essa função chama o upload no S3 e retorna a URL
            return uploadFile(is, fileName, contentType);
            
        }
        //deixa só esse catch porque pode ter algum
        //erro de digitação no input
        catch (IOException e) {
            throw new IllegalArgumentException(e.getMessage());
        }
    }
    
    private URL uploadFile(InputStream is, String fileName, String contentType) {
        ObjectMetadata meta = new ObjectMetadata();
        meta.setContentType(contentType);
        
        //aqui ele faz o upload no s3 pra gente
        s3client.putObject(bucketName, fileName, is, meta);
        
        //para retornar URL no bucket do AWS
        return s3client.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());
}

Atualizado