Para crear un servicio que te permita cargar un archivo usando Spring Boot, primero debes crear una interfaz de servicio que declare el método que se encargará de cargar el archivo. Por ejemplo:

public interface FileUploadService {
  void uploadFile(InputStream inputStream);
}

Luego puedes implementar esta interfaz en tu clase de servicio y proporcionar la lógica para cargar el archivo en el método uploadFile(). Por ejemplo:

Guardar el archivo en un disco local

@Service
public class FileUploadServiceImpl implements FileUploadService {

  private final String UPLOAD_DIR = "/path/to/upload/directory";

  @Override
  public void uploadFile(InputStream inputStream) {
    try {
      byte[] bytes = IOUtils.toByteArray(inputStream);
      Path path = Paths.get(UPLOAD_DIR + "/" + UUID.randomUUID().toString());
      Files.write(path, bytes);
    } catch (IOException e) {
      // manejar excepción
    }
  }

}

Guardar el archivo en AWS

Otra alternativa sería tomar ese mismo archivo y guardarlo directamente en un storage de AWS:

@Service
public class FileUploadServiceImpl implements FileUploadService {

  @Value("${aws.accessKey}")
  private String accessKey;

  @Value("${aws.secretKey}")
  private String secretKey;

  @Value("${aws.s3.bucketName}")
  private String bucketName;

  @Override
  public void uploadFile(InputStream inputStream) {
    try {
      BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
      AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
          .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
          .build();

      ObjectMetadata metadata = new ObjectMetadata();
      metadata.setContentType("application/octet-stream");
      metadata.setContentLength(inputStream.available());

      PutObjectRequest request = new PutObjectRequest(bucketName, UUID.randomUUID().toString(), inputStream, metadata);
      s3Client.putObject(request);
    } catch (IOException e) {
      // manejar excepción
    }
  }

}

En este ejemplo, se crea un cliente AmazonS3 utilizando las credenciales de AWS proporcionadas en el archivo de configuración de la aplicación. Luego se crea un objeto ObjectMetadata y se establece el tipo de contenido y el tamaño del archivo. Finalmente, se crea un objeto PutObjectRequest que contiene la información del archivo, incluyendo el nombre del bucket de S3 en el que se desea guardar el archivo, el InputStream del archivo y el objeto ObjectMetadata creado anteriormente. Luego se llama al método putObject() del cliente AmazonS3 para guardar el archivo en el bucket de S3.

Implementar el Controller

Luego puedes inyectar la implementación del servicio en cualquier componente de tu aplicación que necesite cargar un archivo, como un controlador de Spring MVC, y llamar al método uploadFile() proporcionando el InputStream del archivo que se desea cargar. Por ejemplo:

@Controller
public class MyController {

  @Autowired
  private FileUploadService fileUploadService;

  ...

  @PostMapping("/upload")
  public void handleFileUpload(@RequestParam("file") MultipartFile file) {
    fileUploadService.uploadFile(file.getInputStream());
  }

}

En este ejemplo, se asume que el controlador está manejando una solicitud de carga de archivos enviada mediante un formulario HTML utilizando el enctype multipart/form-data. El archivo se recibe como un parámetro de la solicitud y se proporciona al método uploadFile() del servicio mediante el método getInputStream() del objeto MultipartFile.

Probar el servicio mediante CURL

Para cargar un archivo en un servicio de Spring Boot mediante una solicitud curl, debes enviar una solicitud POST al endpoint del servicio que maneja la carga de archivos y proporcionar el archivo en el cuerpo de la solicitud utilizando el enctype multipart/form-data. Por ejemplo, si el endpoint del servicio es /upload y el archivo se llama file.txt, puedes usar el siguiente comando curl:

curl -X POST -F "file=@file.txt" http://localhost:8080/upload

En este caso, se está enviando una solicitud POST al endpoint /upload en el host localhost en el puerto 8080. El archivo se proporciona en el cuerpo de la solicitud utilizando el enctype multipart/form-data y se especifica mediante el parámetro file y el valor @file.txt, lo que indica que el archivo se llama file.txt y se encuentra en el directorio actual.

Tenga en cuenta que este comando curl es solo un ejemplo y debería ser adaptado según sea necesario para cumplir con las necesidades específicas de la aplicación. Por ejemplo, podrías necesitar proporcionar información de autenticación si el servicio está protegido por autenticación.

Si quieres aprender más sobre como crear API REST de forma profesional, te inviamos a nuestro curso Mastering API REST con Spring Boot, donde aprenderás todo lo necesario para crear un API desde cero, con seguridad, validaciones, DTO y las mejores prácticas de la industria.