https://github.com/cloudacy/zippen
A lightweight and easy to use js zip generator
https://github.com/cloudacy/zippen
Last synced: 4 months ago
JSON representation
A lightweight and easy to use js zip generator
- Host: GitHub
- URL: https://github.com/cloudacy/zippen
- Owner: cloudacy
- Created: 2020-05-08T13:12:30.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2024-05-01T08:24:05.000Z (about 2 years ago)
- Last Synced: 2024-05-02T20:27:06.050Z (about 2 years ago)
- Language: TypeScript
- Size: 253 KB
- Stars: 1
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
# zippen
`zippen` is a small and easy to use zip generator. It can be used to pack multiple files / buffers into one .zip file / buffer.
This package was built based on the [**pkware .ZIP File Format Specification**](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT).
## usage
### import
#### commonjs
```javascript
const Zip = require('@cloudacy/zippen').Zip
```
#### es6 module
```javascript
import {Zip} from '@cloudacy/zippen'
```
### create zip object
```javascript
const zip = new Zip()
```
### add entries to the zip
##### arguments
- path - `string`: The location of the file to be stored in the .zip file (may also contain directories: e.g. `foo/bar.txt`)
- last modified date - `Date`: A date object, holding the last modified date of the file or directory
- data - `Buffer | undefined`: If the entry is a file, this should be a buffer, holding the uncompressed data. If it is a directory, pass `undefined` here.
```javascript
zip.addEntry('foo.txt', new Date(), Buffer.from('bar'))
```
### return the resulting .zip file buffer
This will return the resulting .zip buffer.
```javascript
zip.build()
```
### store resulting .zip file
`write` will store the resulting .zip file at the given file path.
##### arguments
- path - `string | number | Buffer | URL`: The location of the resulting .zip file.
```javascript
zip.write('foo.zip')
```
## example
```javascript
const zip = new Zip()
zip.addEntry('foo.txt', new Date(), Buffer.from('bar'))
zip.write('foo.zip')
```
## general zip structure
- `local file header 1`
- `encryption header 1`
- `file data 1`
- `data descriptor 1`
- ...
- `local file header n`
- `encryption header n`
- `file data n`
- `data descriptor n`
- `archive decryption header`
- `archive extra data record`
- `central directory header 1`
- ...
- `central directory header n`
- `zip64 end of central directory record`
- `zip64 end of central directory locator`
- `end of central directory record`
### example of a .zip file
The following example is a hexdump of a .zip file, holding one file, called `abc.txt` with the content `abc\n`. The file was generated by a macOS 10.14.2 system.
All parts of the .zip file were grouped to the pieces of a .zip file. The bytes were also grouped by their meaning, based on the specification.
#### local file header block
- local file header signature: `50 4b 03 04`
- version needed to extract: `14 00`
- general purpose bit flag: `08 00`
- compression algorithm: `08 00`
- last mod file time (MSDOS format): `6b 81`
- last mod file date (MSDOS format): `8f 4d`
- crc-32: `00 00 00 00`
- compressed size: `00 00 00 00`
- uncompressed size: `00 00 00 00`
- file name length: `07 00`
- extra field length: `10 00`
- file name: `61 62 63 2e 74 78 74` - ASCII: `abc.txt`
#### compressed data block(s)
- compressed data: `4b 4c 4a e6 02 00`
#### data descriptor block(s)
- data descriptor signature (unofficial): `50 4b 07 08`
- crc-32: `4e 81 88 47`
- compressed size: `06 00 00 00`
- uncompressed size: `04 00 00 00`
#### central directory block(s)
- central file header signature: `50 4b 01 02`
- version made by: `15 03`
- version needed to extract: `14 00`
- general purpose bit flag: `08 00`
- compression method: `08 00`
- last mod file time (MSDOS format): `6b 81`
- last mod file date (MSDOS format): `8f 4d`
- crc-32: `4e 81 88 47`
- compressed size: `06 00 00 00`
- uncompressed size: `04 00 00 00`
- file name length: `07 00`
- extra field length: `00 00`
- file comment length: `00 00`
- disk number start: `00 00`
- internal file attributes: `00 00`
- external file attributes: `00 40 a4 81`
- relative offset of local header: `00 00 00 00`
- file name: `61 62 63 2e 74 78 74` - ASCII: `abc.txt`
#### end of central directories block
- end of central directories signature: `50 4b 05 06`
- disk number: `00 00`
- disk number: `00 00`
- number of entries: `01 00`
- number of entries on this disk: `01 00`
- size of central directory block(s): `41 00 00 00`
- offset of central directory block(s): `4b 00 00 00`
- comment length: `00 00`