Necesitamos ser capaces de soportar cargas grandes a nuestro sitio. Es por eso que implementamos la carga fragmentada con Dropzone.js.
Funciona muy bien, pero cuando uso un archivo muy grande, puedo ver en la vista de depuración de la red de Chrome que todas las solicitudes se inician inmediatamente en un estado pendiente y el navegador no puede mantenerse al día. Después de un tiempo, hay demasiadas solicitudes abiertas y Chrome comienza a mostrar "net::ERR_INSUFFICIENT_RESOURCES" para algunas de las solicitudes pendientes.
Estas son las opciones relevantes de nuestra configuración de Dropzone:
[...] parallelUploads: 1, // only one file is uploaded at a time maxFilesize: 8148, // max individual file size 8 GB chunking: true, // enable chunking forceChunking: true, // forces chunking when file.size < chunkSize parallelChunkUploads: true, // allows chunks to be uploaded in parallel chunkSize: 2*1024*1024, // chunk size 2MB retryChunks: true, // retry chunks on failure retryChunksLimit: 3 [...]Este es uno de los cientos de errores de recursos insuficientes de la consola de Chrome al cargar archivos grandes:
dropzone.js:9622 POST http://localhost:44802/AuthenticatedFolder/65fc862e-4cb1-41b0-a39c-f6a41ea5e64d/DoChunkedUpload/A8BB25EA676977DC6F064AEEE636E388FCF5E513 net::ERR_INSUFFICIENT_RESOURCES submitRequest @ dropzone.js:9622 _uploadData @ dropzone.js:9406 handleNextChunk @ dropzone.js:9218 (anonymous) @ dropzone.js:9248 (anonymous) @ dropzone.js:9423 transformFile @ dropzone.js:7545 _loop @ dropzone.js:9419 _transformFiles @ dropzone.js:9429 uploadFiles @ dropzone.js:9171 processFiles @ dropzone.js:9078 processFile @ dropzone.js:9051 processQueue @ dropzone.js:9042 (anonymous) @ dropzone.js:8743 setTimeout (async) enqueueFile @ dropzone.js:8742 (anonymous) @ dropzone.js:8705 accept @ dropzone.js:7407 accept @ dropzone.js:8669 addFile @ dropzone.js:8695 (anonymous) @ dropzone.js:8571 _addFilesFromItems @ dropzone.js:8595 drop @ dropzone.js:8510 drop @ dropzone.js:8225Estoy usando la última versión 5 de dropzone (5.9.3).
¿Hay alguna forma de limitar el número de solicitudes en ejecución paralelas? Si no, sería una gran adición a las opciones. Como solución temporal, deshabilité las cargas paralelas de Chunk. Funciona, pero por supuesto también ralentiza la carga.
¡Gracias por cualquier ayuda!
Tenemos exactamente el mismo problema en una aplicación en el trabajo. Hay una solicitud de fusión aquí https://gitlab.com/meno/dropzone/-/merge_requests/53 que proporciona una solución. He preguntado sobre el estado, pero la solicitud de fusión ya es bastante antigua. Sin embargo, la solución parece implementarse con bastante facilidad y nuestro plan actual es copiar el código fuente de Dropzone y hacerlo nosotros mismos. Obviamente, esto no es lo ideal, ya que confiaríamos en una copia local de cualquier versión que copiemos, pero podría valer la pena hasta que Dropzone decida resolverlo por sí mismo. Te mantendré informado
Una solución que funcionó para mi caso es:
// Wrapper for upload process to prevent "Not enough resource error" const oldFunction = fileUploader.submitRequest; let inProgress = 0; fileUploader.submitRequest = function(xhr, formData, files){ runQueue(oldFunction,this,xhr, formData, files) } function runQueue(uploadDataFunction,scope,xhr, formData, files){ if(inProgress <= 50){ inProgress++; xhr.onreadystatechange = function () { if (xhr.readyState === 4) { inProgress--; } } uploadDataFunction.call(scope,xhr, formData, files); }else{ setTimeout(function(){runQueue(uploadDataFunction,scope,xhr, formData, files)},100); } }Anulo la función que es responsable de procesar las solicitudes individuales. Ponga en cola 50 procesos en paralelo (que yo sepa, Chrome procesa un máximo de 2 procesos en paralelo) para que haya un búfer y todos los demás procesos se vuelvan a verificar después de un tiempo de espera y, si hay menos de 50 procesos en cola, se agregan.