Probé la carga de archivos muy grandes con XMLHttpRequest y noté un comportamiento interesante de Chrome (90.0.4430.212): carga el archivo completo, pero termina con un código 200-OK y un resultado vacío (!). Primero pensé que era un tiempo de espera silencioso o lo que sea, pero no, parece ser un límite de memoria alcanzado.
Probarlo en Firefox (13.0esr (64 bits)) tomó años, pero al final sabía más: la transferencia en sí no provocó un evento de "error" o "tiempo de espera", resultó con 200 y resultado vacío también . Pero arrojó un error:
Exception { name: "NS_ERROR_OUT_OF_MEMORY", message: "", result: 2147942414, filename: "http://localhost/testcenter-backend/vo_data/teterei.html", lineNumber: 16, columnNumber: 0, data: null, stack: "transferComplete@http://localhost/testcenter-backend/vo_data/teterei.html:16:9\n" } Entonces, no tiene nada que ver con el transporte en sí, pero aparentemente se alcanzó un límite de memoria al intentar hacer algo con el resultado. Cuando no uso oReq.response , el error no aparece.
Bien, ¿cómo manejar esto? En Firefox puedo detectar el error con un simple bloque try catch. Pero esto no funciona para Chrome. Un enfoque ingenuo sería simplemente verificar si el contenido resultante está vacío, pero me pregunto si existe otra posibilidad de detectar que esto sucede.
--
Cómo reproducir:
Generé un archivo de 10,4 GB de esta manera:
dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*10000] const oReq = new XMLHttpRequest(); function updateProgress (oEvent) { console.log("progress", oEvent.loaded); } function transferComplete(evt) { console.log("The transfer is complete.", oReq.getAllResponseHeaders(), oReq.status); console.log(oReq.response); // here too much memory is allocated } function transferFailed(evt) { console.log("error", oReq.getAllResponseHeaders(), oReq.status); } function transferCanceled(evt) { console.log("cancel", oReq.getAllResponseHeaders(), oReq.status); } function timeOut(evt) { console.log("timeout", oReq.getAllResponseHeaders(), oReq.status); } oReq.addEventListener("progress", updateProgress); oReq.addEventListener("load", transferComplete); oReq.addEventListener("error", transferFailed); oReq.addEventListener("abort", transferCanceled); oReq.addEventListener("timeout", timeOut); // your huge file here instead oReq.open("GET", "https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"); // URL to huge file here oReq.send();El límite de memoria real puede variar según su sistema.