webgme
Version:
Web-based Generic Modeling Environment
97 lines (75 loc) • 4.37 kB
Markdown
---
title: "Limitations of JSZip"
layout: default
section: limitations
fullpage: true
---
### Not supported features
Not all features of zip files are supported. Classic zip files will work
but encrypted zip, multi-volume, etc are not supported and the loadAsync()
method will return a failed promise.
### ZIP64 and 32bit integers
ZIP64 files can be loaded, but only if the zip file is not "too big". ZIP64 uses 64bits integers
but JavaScript represents all numbers as
[64-bit double precision IEEE 754 floating point numbers](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf)
(see section 8.5). So, we have 53bits for integers and
[bitwise operations treat everything as 32bits](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators).
So if all the 64bits integers can fit into 32 bits integers, everything will be
fine. If it's not the case, you will have other problems anyway (see next
limitation).
### Performance issues
An other limitation comes from the browser (and the machine running the
browser). A compressed zip file of 10MB is easily opened by firefox / chrome
/ opera / IE10+ but will crash older IE. Also keep in mind that strings in
javascript are encoded in UTF-16 : a 10MB ascii text file will take 20MB of
memory.
The
[`async` method]({{site.baseurl}}/documentation/api_zipobject/async.html) and the
[`generateAsync` method]({{site.baseurl}}/documentation/api_jszip/generate_async.html)
hold the full result in memory but doesn't freeze the browser. If the result
is too big, and if you can't use the
[`nodeStream` method]({{site.baseurl}}/documentation/api_zipobject/node_stream.html) or the
[`generateNodeStream` method]({{site.baseurl}}/documentation/api_jszip/generate_node_stream.html)
you need to use the underlying
[`StreamHelper`]({{site.baseurl}}/documentation/api_streamhelper.html) to
handle the result chunk by chunk and `pause()`/`resume()` to handle the
backpressure.
If you're having performance issues, please consider the following :
* Don't use IE <= 9. Everything is better with typed arrays.
* Use typed arrays (Uint8Array, ArrayBuffer, etc) if possible :
* If you generate a zip file, you should use `type:"uint8array"`
(or blob, arraybuffer, nodebuffer).
* If you load the file from an ajax call, ask your XHR an ArrayBuffer.
Loading a string is asking for troubles.
Note about compression :
When reading a file, JSZip will store the content without decompressing it.
When generating a compressed file, JSZip will reuse if possible the compressed
content :
* If you read a zip file compressed with DEFLATE and call `generate` with the
DEFLATE compression, JSZip won't call the compression algorithms (same with
STORE everywhere.)
* If you read a zip file compressed with DEFLATE and call `generate` with the
STORE compression, JSZip will have to decompress everything.
On IE <=9, typed arrays are not supported and the compression algorithm
will fallback on arrays. In that case, JSZip needs to convert the binary string
into an array, DEFLATE it and convert the result into a binary string.
You don't want that to happen.
### The output zip will differ from the input zip
Reading and generating a zip file won't give you back the same file.
Some data are discarded (file metadata) and other are added (subfolders).
### Encodings support
JSZip only supports UTF-8 natively. A zip file doesn't contain the name of the
encoding used, you need to know it before doing anything.
#### File name
If the name of a file inside the zip is encoded with UTF-8 then JSZip can
detect it (Language encoding flag, Unicode Path Extra Field). If not, JSZip
can't detect the encoding used and will generate [Mojibake](https://en.wikipedia.org/wiki/Mojibake).
You can use the [encodeFileName]({{site.baseurl}}/documentation/api_jszip/generate.html)
option and the [decodeFileName]({{site.baseurl}}/documentation/api_jszip/load.html)
option to encode/decode using a custom encoding.
#### File content
The `async("string")` method uses UTF-8 to decode the content. If you have a text in
a different encoding, you can get the bytes array with `async("uint8array")` and
decode it with a lib (iconv, iconv-lite, etc) on your side.
To save a text using a non-UTF-8 encoding, do the same : encode it into a
Uint8Array before adding it to JSZip.