Estoy usando el paquete de nodos react-s3-uploader , que toma una signingUrl de firma para obtener una URL firmada para almacenar un objeto en S3.
Actualmente, configuré una función lambda (con un punto final de API Gateway) para generar esta URL firmada. Después de algunos retoques, lo hice funcionar, pero noté que tengo que definir en mi función lambda el content-type , que se ve así:
var AWS = require('aws-sdk'); const S3 = new AWS.S3() AWS.config.update({ region: 'us-west-2' }) exports.handler = function(event, context) { console.log('context, ', context) console.log('event, ', event) var params = { Bucket: 'video-bucket', Key: 'videoname.mp4', Expires: 120, ACL: 'public-read', ContentType:'video/mp4' }; S3.getSignedUrl('putObject', params, function (err, url) { console.log('The URL is', url); context.done(null, {signedUrl: url}) }); } El problema es que quiero que esta URL firmada pueda aceptar varios tipos de archivos de video y he intentado configurar ContentType en video/* , que no funciona. Además, debido a que este punto final lambda no es lo que realmente toma la carga, no puedo pasar el tipo de archivo a esta función de antemano.
Tendrá que encontrar una manera de descubrir el tipo de archivo y pasarlo a la función Lambda como argumento. No hay una alternativa, aquí, con un PUT .
El proceso de firma de solicitud para PUT no prevé comodines o valores múltiples/alternativos.
En caso de que alguien más esté buscando una respuesta funcional, finalmente descubrí que react-s3-uploader pasa el tipo de contenido y el nombre de archivo a la URL de getSignin (excepto que había olvidado pasar la consulta en API Gateway antes), entonces pude extraerlo como event.params.querystring.contentType en lambda.
Luego, en los parámetros, simplemente configuro {ContentType: event.params.querystring.contentType} y ahora acepta todos los formatos de archivo.