Estoy tratando de cargar archivos más grandes en un depósito de Google desde nodejs. cargar cualquier archivo por debajo y alrededor de la marca de tamaño de 200 MB funciona perfectamente bien. Cualquier cosa mayor que eso devuelve un error.
Cannot create a string longer than 0x1fffffe8 charactersAl tener un archivo tan grande, descubrí que el nodo tiene limitaciones sobre qué tan grande puede ser un blob/archivo. Aquí están los dos fragmentos de código que arrojan el mismo error
Este es con transmisión de carga
let fileSize = file.size; fs.createReadStream(file) .pipe( upload({ bucket: BUCKET, file: file, }) ) .on("progress", (progress) => { console.log("Progress event:"); console.log("\t bytes: ", progress.bytesWritten); const pct = Math.round((progress.bytesWritten / fileSize) * 100); console.log(`\t ${pct}%`); }) .on("finish", (test) => { console.log(test); console.log("Upload complete!"); resolve(); }) .on("error", (err) => { console.error("There was a problem uploading the file"); reject(err); });y, por supuesto, solo una carga de cubo regular
await storage.bucket(BUCKET) .upload(file.path, { destination: file.name, })Llegué a la conclusión de que la única solución puede ser fragmentar el archivo, cargarlo en fragmentos y volver a unir los fragmentos de archivo en el depósito. El problema es que no sé cómo hacerlo y no puedo encontrar ninguna documentación en Google o GitHub para esta cláusula.
Para resolver este problema, verifiqué el tamaño del archivo para ver si superaba los 200 MB. Lo dividí en fragmentos de 200 MB (aproximadamente) y luego subí cada uno individualmente. luego unió los archivos con bucket.combine()
Una nota muy importante es agregar el tiempo de espera. de forma predeterminada, Google tiene un tiempo de espera de carga de archivos de 1 minuto, lo configuré en 60 minutos en el fragmento a continuación. Es un enfoque muy hacky, debo admitir
if (uploadF.size > 209715200) { await splitFile .splitFileBySize(file.path, "2e8") .then(async (names) => { console.log(names); for (let i = 0; i < names.length; i++) { console.log("uploading " + names[i]); await storage .bucket(BUCKET) .upload(names[i], { destination: names[i], timeout: 3600000, }) .catch((err) => { return { status: err }; }); } await bucket .combine(names, file.name) .catch((err) => { return { status: err, }; }); for (let i = 0; i < names.length; i++) { console.log("deleting " + names[i]); await storage .bucket(BUCKET) .file(names[i]) .delete() .then(() => { console.log(`Deleted ${name[i]}`); }) .catch((err) => { return { status: err }; }); } console.log("done"); return { status: "ok" }; })