es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La carga de archivos de AWS S3 no funciona cuando la interfaz de usuario y la capa intermedia están desplegadas en diferentes servidores de red, pero funciona en localhost con SpringBoot.

La imagen anterior muestra la estructura de despliegue de mi aplicación. La aplicación de Spring Boot tiene la siguiente configuración de AWS.

La aplicación funciona en local. Puedo escribir archivos en el cubo de S3.
Cuando despliego el código en un servidor diferente como se muestra en la imagen anterior, falla al escribir en el cubo de S3.
Muestra el siguiente error:

Error mientras se carga el archivo en S3java.io.FileNotFoundException: sample.txt (Permiso denegado)"

Nota: Estos servidores están en diferentes ubicaciones.

¿Cómo puedo solucionar este problema?
Tengo una solución:

  1. Escribir el archivo de carga en la carpeta del servidor UI y utilizar un script para cargarlo en S3.
    Por favor, sugiera otra solución si tiene alguna.

Edit 1:
1. Puedo recibir la solicitud del servidor UI, pero el archivo no está presente en la solicitud.
2. Otras solicitudes GET están funcionando.

Controller:

@PostMapping("/request")
ReturnStatus saveRequest(HttpServletRequest request,

                         @RequestParam(value = "file", required = true)
                                 MultipartFile uploadedFile) throws InvalidInputException {
    AuthDto auth = (AuthDto) request.getAttribute(AUTH_DTO);
    return requestService.saveRequest(
            new RequestParams( uploadedFile));
}

Service Class Logic:

File uploadFile = convertMultiPartToFile(params.getLookUpValues());
s3ClientBuilder.build().putObject(new PutObjectRequest(s3BucketName, fileName, uploadFile));

public static File convertMultiPartToFile(MultipartFile file) throws IOException {
    File convFile = new File(file.getOriginalFilename());
    FileOutputStream fos = new FileOutputStream(convFile);
    fos.write(file.getBytes());
    fos.close();
    return convFile;
} 

Edit 3:
enter image description here

Crear una carpeta temporal dentro del servidor UI de Tomcat.

Una vez que hago clic en “cargar archivo”, se guarda en la carpeta temporal y se envía una solicitud a Elastic Beanstalk para guardar los metadatos.

¿Cómo funciona la carga de archivos en el cubo de S3?
¿Necesito escribir un script separado? Si es así, ¿cómo se activa?

Por favor, corrijan si me equivoco.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución al problema de no poder escribir el archivo en el cubo de S3

    El problema se debe a un error de permiso denegado al escribir el archivo en el cubo de S3, lo cual ocurre cuando la aplicación Spring Boot se implementa en un servidor diferente al que se ejecuta localmente.

    Para superar este problema, una posible solución es escribir el archivo de carga en la carpeta del servidor de UI y utilizar un script para cargarlo en S3, como se menciona. Otra posible solución es crear una carpeta temporal dentro del servidor Tomcat de UI donde se pueda guardar el archivo cargado, y luego enviar la solicitud a Elastic Beanstalk para guardar los metadatos.

    La carga de archivos en el cubo de S3 se puede lograr utilizando un script separado. Este script puede ser activado por un trabajo cron o un disparador configurado en Elastic Beanstalk.

    Para asegurarse de que el archivo esté presente en la solicitud cuando sea recibido por el servidor de UI, se debe verificar la lógica de carga de archivos en la clase de servicio. El método convertMultiPartToFile debe ser llamado con el parámetro uploadedFile en lugar de params.getLookUpValues() de la siguiente manera:

    File uploadFile = convertMultiPartToFile(uploadedFile);
    s3ClientBuilder.build().putObject(new PutObjectRequest(s3BucketName, fileName, uploadFile));
    

    Además, se debe verificar la firma del método del controlador para asegurarse de que esté recibiendo correctamente el archivo en la solicitud.

    @PostMapping("/request")
    ReturnStatus saveRequest(HttpServletRequest request,
    
                         @RequestParam(value = "file", required = true)
                                 MultipartFile uploadedFile) throws InvalidInputException {
        AuthDto auth = (AuthDto) request.getAttribute(AUTH_DTO);
        return requestService.saveRequest(
            new RequestParams( uploadedFile));
    }
    

    Al implementar estas soluciones, se puede resolver el problema de no poder escribir el archivo en el cubo de S3.

Comments are closed.