bootstrap - ¿Hay alguna limitación en el tamaño de Max Blob de JavaScript?
option javascript (2)
Estoy tratando de descargar un archivo usando AJAX. Necesito usar la llamada AJAX porque tengo que hacer una solicitud de publicación junto con la que necesito enviar algunos encabezados del cliente. Como la API del servidor no está bajo nuestro control, no tenemos otra opción más que usar AJAX. Para mostrar el cuadro de diálogo de guardado de archivo, estoy convirtiendo la matriz de bytes en blob a la URL del objeto como se muestra a continuación
var oReq = new XMLHttpRequest();
oReq.open("POST","api/operations/zip", true);
oReq.responseType = "arraybuffer";
oReq.onload = function(oEvent) {
var blob=new Blob([oReq.response], {type: ''application/octet-binary''});
var link=document.createElement(''a'');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.zip"; link.click();
}
oReq.send(filePaths);
Ahora me gustaría saber si hay algún límite en el tamaño de Blob que podamos tener en JavaScript que no sea la restricción de memoria del navegador. Como es posible descargar archivos de 4 GB si tengo alrededor de 8 GB de RAM.
La respuesta existente aparece en gran medida fuera de fecha.
Chrome ( 57+ parece ):
Según el diseño del sistema de almacenamiento de blobs de Chrome :
Límites de almacenamiento de blobs
Calculamos los límites de almacenamiento here .
Límite de almacenamiento en memoria
- Si la arquitectura es x64 y NO es ChromeOS o Android:
2GB
- De lo contrario:
total_physical_memory / 5
Límite de almacenamiento en disco
- Si ChromeOS:
disk_size / 2
- Si Android:
disk_size / 20
- Si no:
disk_size / 10
Nota: el disco de ChromeOS es parte de la partición del usuario, que está separada de la partición del sistema.
Disponibilidad mínima de disco
Limitamos nuestro límite de disco para aceptar una disponibilidad mínima de disco. La ecuación que utilizamos es:
min_disk_availability = in_memory_limit * 2
Límites de ejemplo
(Todos los tamaños en GB)
Device | Ram | In-Memory Limit | Disk | Disk Limit | Min Disk Availability ----------------+-----+-----------------+------+------------+---------------------- Cast | 0.5 | 0.1 | 0 | 0 | 0 Android Minimal | 0.5 | 0.1 | 8 | 0.4 | 0.2 Android Fat | 2 | 0.4 | 32 | 1.5 | 0.8 CrOS | 2 | 0.4 | 8 | 4 | 0.8 Desktop 32 | 3 | 0.6 | 500 | 50 | 1.2 Desktop 64 | 4 | 2 | 500 | 50 | 4
Para aclarar, disk_size
es aparentemente el tamaño total del disco, no el espacio disponible en el disco (probablemente por razones de privacidad, pero parece que eso podría causar problemas).
Chrome utiliza un directorio llamado blob_storage
en el directorio de perfiles de Chrome para almacenar partes de blob en el disco.
No estoy seguro de si o cómo se imponen otros límites si el espacio disponible en el disco o la RAM disponible son menores que los límites del software. Voy a actualizar esta respuesta cuando sepa más.
Ópera (44+ o quizás anterior):
Igual que Chrome, ya que se basa en Chromium.
Firefox (53+ o quizás antes):
No hay límite duro aparente. Soy capaz de crear Blob''s significativamente más grande que las afirmaciones de FileSaver.js "800 MiB". No utiliza espacio en el disco para hacer copias de mayor tamaño, por lo que todo va en la memoria, posiblemente con la memoria de paginación del sistema operativo en el disco. Esto significa que los blobs más grandes que la memoria pueden ser posibles, aunque probablemente con un mal rendimiento.
Safari (10.1+ o quizás antes):
No hay límite duro aparente. No utiliza espacio en el disco para hacer copias de mayor tamaño, por lo que todo va en la memoria, posiblemente con la memoria de paginación del sistema operativo en el disco. Esto significa que los blobs más grandes que la memoria pueden ser posibles, aunque probablemente con un mal rendimiento.
Se añadirán otros límites de navegador a medida que los aprenda.
Los blobs parecen estar limitados a 500MiB en Chrome y actualmente están almacenados en la memoria, aunque hay un rediseño en curso:
https://code.google.com/p/chromium/issues/detail?id=375297
Otras implementaciones de navegador tienen límites ligeramente diferentes: