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)
@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());
}