Estoy administrando un portal, integrado en la pila MERN, en el que los usuarios pueden cargar de forma independiente los nuevos contenidos de audio/video creados. Decidí usar Google Cloud Storage como un servicio para almacenar contenido de usuario. (Sé que también puedes usar Firebase, por el momento prefiero usar "solo" Cloud Storage).
En el backend, a través de express, creé un punto final POST/usercontent y, a través de multer, recibí el archivo y luego lo guardé en Google Cloud.
Todo funciona perfectamente, pero no entiendo si estoy funcionando correctamente: me gustaría que el archivo se guardara DIRECTAMENTE en GCloud, sin guardarlo, ni siquiera temporalmente, en el backend. Esto se debe a que el contenido puede ser grande y es posible que tenga problemas de memoria.
Entiendo que necesito usar flujos, tuberías y PassThrough, sin embargo, mi conocimiento de este tema es limitado en este momento. He leído estas respuestas y ejemplos detenidamente, pero no puedo entender cómo trabajar correctamente al mismo tiempo que incorporo multer.
Fuentes:
https://github.com/googleapis/nodejs-storage/blob/main/samples/streamFileUpload.js No se puede canalizar la secuencia de lectura de archivos de Google Cloud Storage a la API de Google Drive https://cloud.google.com/storage/docs /streaming#code-samples ¿Cómo cargar un archivo de datos en la memoria al almacenamiento en la nube de Google usando nodejs?
Mi código:
import Multer from 'multer'; import { Storage } from '@google-cloud/storage'; // config multer const multerStorage = Multer({ storage: Multer.memoryStorage(), limits: { fileSize: 10*1024*1024 } }); // set endpoint router.post('/upload', multerStorage.single('uploadedFile'), async (req, res, next) => { // creates a client from a Google service account key const storage = new Storage({ projectId: 'xxx', keyFilename: 'yyy' }); // access bucket const bucket = storage.bucket('bucketName'); // create new file inside bucket const newFile = bucket.file(req.file.originalname); // STREAM ***HERE MY DOUBTS! *** const fileStream = newFile.createWriteStream({ metadata: { contentType: req.file..mimetype }, resumable: false }); fileStream.write(req.file.buffer); fileStream.on('error', err => { console.error('error', err) }); fileStream.on('finish', () => { console.log('finish!'); }); fileStream.end(); // 7 response res.status(200).json({ status: res.statusCode, message: 'Upload OK' }); });¿Alguien puede ayudarme a implementar este código para enviar directamente la transmisión a Google Cloud Storage?
El propósito de la transferencia de Streaming es transmitir datos hacia y desde su cuenta de Cloud Storage sin necesidad de que los datos se guarden primero en un archivo como se menciona en este documento .
El método createWriteStream, que le preocupa, está documentado aquí . Puede controlar la transmisión utilizando las opciones disponibles aquí .
Para la carga reanudable, los archivos se pueden almacenar localmente si se puede escribir en el directorio como se indica en este documento .
Las cargas reanudables se habilitan automáticamente y deben desactivarse explícitamente configurando options.resumable en falso.
Las cargas reanudables requieren acceso de escritura al directorio $HOME. A través
config-store, se almacenan algunos metadatos. De forma predeterminada, si no se puede escribir en el directorio, recurriremos a una carga simple. Sin embargo, si solicita explícitamente una carga reanudable y no podemos escribir en el directorio de configuración, devolveremos un ResumableUploadError.
En su caso, como ha establecido options.resumable en false, debería ser una carga simple y no debería almacenar el archivo localmente.
Para verificar si se almacena en el almacenamiento local, puede ejecutar el código en el alcance que evita la escritura binaria en el disco. Alternativamente, puede monitorear el uso del disco durante la operación de carga.