En mi aplicación NodeJS, tengo una respuesta axios que devuelve un flujo. Me gustaría cargar esta secuencia en mi depósito de S3, pero también necesito saber el ContentType para evitar la asignación predeterminada de application/octet-stream de S3.
Hasta ahora, he desarrollado una función que carga una transmisión usando Stream.PassThrough :
streamUpload(key: string, acl: string) { const pass = new stream.PassThrough(); const upload = new Upload({ client: this.s3Client, params: { Key: key, Body: pass, Bucket: `${process.env.BUCKET}`, ACL: acl, ContentType: "" // <--- How can I find this from a stream without storing the file in memory?? }, }) return { writeStream: pass, upload, }; } Como resultado, puedo usar esta función para pipe los datos de flujo de mi respuesta axios al PassThrough y luego await usando upload.done() mientras el archivo se carga de esta manera:
// data is a stream! const { data } = await axios.post('http://watermark:4006', {}, { responseType: "stream", }); const { writeStream: uploadWS, upload } = s3API.streamUpload(audioEnding, 'public-read'); // pipe the stream to my `PassThrough` // Can I add a custom Transform to extract the content-type from the stream before // passing it to my uploadWriteStream? pipeline(data, uploadWS, (e) => { if (!!e) { console.log(e) } }) // The S3 library allows you to wait while data is being uploaded await upload.done() Descubrí una biblioteca llamada tipo de archivo que permite recuperar el tipo de archivo a través de una secuencia usando fileTypeFromStream , sin embargo, no estoy seguro de cómo agregar esto a mi pipeline para extraer el tipo de archivo antes de ejecutar el siguiente paso de mi canalización porque es una función que debe pasar un argumento de flujo que debe awaited antes de recibir el tipo de archivo.
¡Me encantaría escuchar alguna sugerencia!