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.

¿Cómo se envía un archivo a s3 desde una solicitud POST?

Estoy tratando de implementar un sitio web que pueda manejar solicitudes post. Para hacerlo, he configurado una puerta de enlace de API que invoca una función lambda. La lambda está estructurada de la siguiente manera:
“`
exports.handler = async (event) => {
// TODO implement
var ht = ” Documento

<pre><code>if (JSON.stringify(event['requestContext']['http']['method']) == "GET"){
    const response = {
        "statusCode": 200,
        "body": ht,
        "headers": {
            'Content-Type': 'text/html',
        }
    }

    return response;
}

}

if (JSON.stringify(event[‘requestContext’][‘http’][‘method’]) == “POST”){
// reenvía el archivo cargado a s3

return 1;

}

};

En este momento, al realizar la solicitud GET, la página HTML renderizada contiene un botón para elegir un archivo y otro para enviarlo. La idea es que al presionar enviar, se cargue un archivo y se active la solicitud POST. Me preguntaba cómo puedo extraer este archivo de las solicitudes dentro de la declaración “if” de la solicitud POST (donde está el segundo comentario), para luego enviarlo a un enlace de s3. También me preguntaba cómo puedo colocar el HTML en su propio archivo index.html y llamarlo desde la función lambda.
Gracias

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para extraer el archivo de la solicitud en la declaración del ‘if’ de “POST”, puedes acceder a él a través del objeto evento. El archivo estará ubicado en el cuerpo del objeto evento, que es una cadena codificada en base64. Necesitarás decodificar esta cadena para obtener los datos reales del archivo. Aquí tienes un ejemplo de cómo puedes acceder y decodificar el archivo en tu función de lambda:

    if (JSON.stringify(event['requestContext']['http']['method']) == '"POST"'){
        // extrae el archivo del cuerpo de la solicitud
        const file = Buffer.from(event.body, 'base64');
    
        // TODO: enviar el archivo al bucket de S3
    }
    

    Para almacenar el archivo en un bucket de S3, puedes utilizar el SDK de AWS para Node.js. Aquí tienes un ejemplo de cómo puedes cargar el archivo en un bucket de S3 en tu función de lambda:

    const AWS = require('aws-sdk');
    const s3 = new AWS.S3();
    
    if (JSON.stringify(event['requestContext']['http']['method']) == '"POST"'){
        // extrae el archivo del cuerpo de la solicitud
        const file = Buffer.from(event.body, 'base64');
    
        // carga el archivo en S3
        const params = {
            Bucket: 'nombre-del-bucket',
            Key: 'nombre-del-archivo',
            Body: file
        };
    
        const result = await s3.upload(params).promise();
        console.log(result.Location);
    }
    

    Para incluir el HTML en un archivo index.html, puedes crear un archivo separado en el mismo directorio que tu archivo de función de lambda y nombrarlo index.html. Luego, puedes cargar el HTML de este archivo leyendo su contenido en una variable y devolviéndolo en la respuesta de la función de lambda. Aquí tienes un ejemplo de cómo puedes cargar el HTML desde el archivo index.html:

    const fs = require('fs');
    
    exports.handler = async (event) => {
        // lee el HTML del archivo index.html
        const html = fs.readFileSync('index.html', 'utf-8');
    
        if (JSON.stringify(event['requestContext']['http']['method']) == '"GET"'){
            const response = {
                "statusCode": 200,
                "body": html,
                "headers": {
                    'Content-Type': 'text/html',
                }
            };
    
            return response;
        }
    
        // TODO: manejar solicitud POST
    };
    

    Ten en cuenta que en este ejemplo, estamos utilizando el módulo fs integrado de Node.js para leer el contenido del archivo. Este módulo no está disponible en el entorno de ejecución predeterminado de AWS Lambda, por lo que deberás utilizar un entorno de ejecución personalizado o empaquetar el módulo fs con tu función de lambda si deseas usarlo en tu código.

Comments are closed.