Necesito enviar un archivo de video desde el almacenamiento en la nube de Google a una API, esta API normalmente acepta flujos de archivos fs. Sin embargo, esto significa que tengo que guardar el archivo de video descargándolo y guardándolo en un archivo local antes de enviarlo. Realmente me gustaría evitar eso si es posible.
Así es como actualmente estoy enviando mis archivos de video a la API, espera un flujo de lectura fs.
const filestream = fs.createReadStream('C:/Users/[me]/Downloads/testvid.mp4'); data.append('video',filestream); axios({ method: 'post', url: postUrl, headers: { 'Content-Type': 'multipart/form-data', ...data.getHeaders() }, data: data })Lo que me gustaría hacer es esencialmente tomar el archivo del depósito de almacenamiento, crear un flujo de lectura SIN guardarlo localmente y pasarlo a mi solicitud de publicación de axios.
const file = await storage.bucket("[bucket]").file("filename.mp4"); fs.createReadStream(file);¿Cómo lograría esto?
Hasta ahora, he intentado pasar el flujo de lectura de Google directamente y he creado un flujo de paso importando 'flujo', pero ninguno ha funcionado. Agradecería cualquier aporte.
En la página Descargar objetos , puede ver en la parte inferior un enlace para Crear transferencias utilizando diferentes orígenes y destinos, como almacenamiento en la nube o sistema de archivos.
Si esto no es lo que quieres hacer, puedes usarlo o combinarlo con las transferencias de Streaming . Hay un buen ejemplo de flujos de descarga usando Node.js como sigue:
/** * TODO(developer): Uncomment the following lines before running the sample. */ // The ID of your GCS bucket // const bucketName = 'your-unique-bucket-name'; // The ID of your GCS file // const fileName = 'your-file-name'; // The filename and file path where you want to download the file // const destFileName = '/local/path/to/file.txt'; // Imports the Google Cloud client library const {Storage} = require('@google-cloud/storage'); // Creates a client const storage = new Storage(); async function streamFileDownload() { // The example below demonstrates how we can reference a remote file, then // pipe its contents to a local file. // Once the stream is created, the data can be piped anywhere (process, sdout, etc) await storage .bucket(bucketName) .file(fileName) .createReadStream() //stream is created .pipe(fs.createWriteStream(destFileName)) .on('finish', () => { // The file download is complete }); console.log( `gs://${bucketName}/${fileName} downloaded to ${destFileName}.` ); } streamFileDownload().catch(console.error);Seguí una solución similar a la que sugirió Alex, pero en lugar de obtener todo de Google directamente, solo usé una solicitud de obtención en la URL de Google para obtener una transmisión y la pasé a mis datos de formdata como una transmisión. Esto funciona perfectamente para poder enviar un archivo desde un servidor remoto sin descargarlo.
const downStream = await axios({ method: 'GET', responseType: 'stream', url: url }) var data: FormData = new FormData(); data.append('video', downStream.data); const response = await axios({ method: 'post', url: postUrl, headers: { 'Content-Type': 'multipart/form-data', ...data.getHeaders() }, data: data, maxContentLength: Infinity, maxBodyLength: Infinity, })