web-dev-qa-db-fra.com

Y a-t-il une limitation de la taille de JavaScript Max Blob

J'essaie de télécharger un fichier en utilisant AJAX appel. J'ai besoin d'utiliser AJAX appel parce que je dois faire une demande de publication avec celle que je dois envoyer certains en-têtes du client. Comme l'API du serveur n'est pas sous notre contrôle, nous n'avons pas beaucoup d'autre choix que d'utiliser AJAX. Afin d'afficher la boîte de dialogue d'enregistrement de fichier, je convertis le tableau d'octets en blob en URL d'objet comme indiqué ci-dessous

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);

Maintenant, je voudrais savoir s'il y a une limite à taille de blob que nous pouvons avoir en JavaScript autre que la contrainte de mémoire du navigateur. comme est-il possible de télécharger un fichier de 4 Go si j'ai environ 8 Go de RAM.

19
Vikash

La réponse actuelle semble largement dépassée.


Chrome ( 57+ il apparaît ):

Selon conception du système de stockage Blob de Chrome :

Limites de stockage des objets blob

Nous calculons les limites de stockage ici .

Limite de stockage en mémoire

  • Si l'architecture est x64 et NON ChromeOS ou Android: 2GB
  • Autrement: total_physical_memory / 5

Limite de stockage sur disque

  • Si ChromeOS: disk_size / 2
  • Si Android: disk_size / 20
  • Autre: disk_size / 10

Remarque: le disque de ChromeOS fait partie de la partition utilisateur, qui est distincte de la partition système.

Disponibilité minimale du disque

Nous limitons notre limite de disque pour permettre une disponibilité minimale du disque. L'équation que nous utilisons est:

min_disk_availability = in_memory_limit * 2

Exemples de limites

(Toutes les tailles en Go)

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

Clarifier, disk_size est apparemment la taille totale du disque, pas l'espace disque disponible (probablement pour des raisons de confidentialité, mais cela pourrait causer des problèmes).

Chrome utilise un répertoire appelé blob_storage dans le répertoire de profil Chrome pour stocker les parties d'objets blob sur le disque.

Je ne sais pas si ou comment d'autres limites sont imposées si l'espace disque disponible ou disponible RAM sont inférieurs aux limites logicielles. Je mettrai à jour cette réponse lorsque j'en saurai plus.


Opera (44+ ou peut-être plus tôt):

Identique à Chrome, car il est basé sur Chrome.


Firefox (53+ ou peut-être plus tôt):

Aucune limite dure apparente. Je suis capable de créer des Blob significativement plus grands que les revendications de "800 MiB" FileSaver.js. Il n'utilise pas d'espace disque pour sauvegarder des objets blob plus volumineux, donc tout va dans la mémoire, potentiellement avec la mémoire de pagination du système d'exploitation sur le disque. Cela signifie que des blobs plus volumineux que la mémoire peuvent être possibles, bien que probablement avec de mauvaises performances.


Safari (10.1+ ou peut-être plus tôt):

Aucune limite dure apparente. Il n'utilise pas d'espace disque pour sauvegarder des objets blob plus gros, donc tout va dans la mémoire, potentiellement avec la mémoire de pagination du système d'exploitation sur le disque. Cela signifie que des blobs plus volumineux que la mémoire peuvent être possibles, bien que probablement avec de mauvaises performances.


D'autres limites de navigateur seront ajoutées au fur et à mesure que je les apprendrai.

24

Les blobs semblent être limités à 500 Mo en Chrome et sont actuellement stockés en mémoire, bien qu'une refonte soit en cours:

https://code.google.com/p/chromium/issues/detail?id=375297

Les autres implémentations de navigateur ont des limites légèrement différentes:

https://github.com/eligrey/FileSaver.js/#supported-browsers

21
Klaus