¿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 = ”
‘
<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
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:
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:
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:
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ódulofs
con tu función de lambda si deseas usarlo en tu código.