FILEBOX
FileBox is a virtual container for packing a file data into it for future read, and easily transport between servers with the least payload, no mater than where it is (local path, remote url, or cloud storage).
Currently the FileBox supports almost all kinds of the data input/output methods/formats:
File Type | Pack Method | Unpack Method | Description |
---|
Local File | fromFile() | toFile() | Local file in file system |
Remote URL | fromUrl() | toUrl() (TBW) | Remote file in a HTTP/HTTPS URL |
Buffer | fromBuffer() | toBuffer() | JavaScript Buffer |
Stream | fromStream() | toStream() | JavaScript Stream |
Base64 | fromBase64() | toBase64() | Base64 data |
DataURL | fromDataURL() | toDataURL() | DataURL data |
JSON | fromJSON() (TBW) | toJSON() (TBW) | Serialize/Deserialize FileBox |
EXAMPLES
The following example demos:
- Save URL to File
- Convert Buffer to Stream
- Pack from Base64 then Unpack to DataURL
import { FileBox } from 'file-box'
const fileBox1 = FileBox.fromUrl(
'https://huan.github.io/file-box/images/file-box-logo.jpg',
'logo.jpg',
)
fileBox1.toFile('/tmp/file-box-logo.jpg')
import * as fs from 'fs'
const fileBox2 = FileBox.fromBuffer(
Buffer.from('world'),
'hello.txt',
)
const writeStream = fs.createWriteStream('/tmp/hello.txt')
fileBox2.pipe(writeStream)
const fileBox3 = FileBox.fromBase64('d29ybGQK', 'hello.txt')
fileBox3.toDataURL()
.then(console.log)
API REFERENCE
1. Load File in to Box
1.1 fromFile(filePath: string): FileBox
Alias: fromLocal()
const fileBox = FileBox.fromLocal('/tmp/test.txt')
Alais: fromRemote()
const fileBox = FileBox.fromUrl(
'https://huan.github.io/file-box/images/file-box-logo.jpg',
'logo.jpg',
)
1.3 fromStream(stream: NoddeJS.ReadableStream, name: string): FileBox
const fileBox = FileBox.fromStream(res, '/tmp/download.zip')
1.4 fromBuffer(buffer: Buffer, name: string): FileBox
const fileBox = FileBox.fromBuffer(buf, '/tmp/download.zip')
1.5 FileBox.fromBase64(base64: string, name: string): FileBox
Decoded a base64 encoded file data.
const fileBox = FileBox.fromBase64('d29ybGQK', 'hello.txt')
fileBox.toFile()
1.6 FileBox.fromDataURL(dataUrl: string, name: string): FileBox
Decoded a DataURL data.
const fileBox = FileBox.fromDataURL('data:text/plain;base64,d29ybGQK', 'hello.txt')
fileBox.toFile()
1.7 FileBox.fromJSON()
Restore a FileBox.toJSON()
text string back to a FileBox instance.
WIP: Not Implement Yet
const restoredFileBox = FileBox.fromJSON(jsonText)
2. Get File out from Box
2.1 toFile(name?: string): Promise<void>
Save file to current work path(cwd) of the local file system with the default name
.
if name
specified with a full path, then will use the speficied file name instead.
const fileBox = FileBox.fromRemote(
'https://huan.github.io/file-box/images/file-box-logo.jpg',
)
await fileBox.toFile('/tmp/logo.jpg')
2.2 pipe(destination: Writable): Promise<void>
Pipe to a writable stream.
const fileBox = FileBox.fromRemote(
'https://huan.github.io/file-box/images/file-box-logo.jpg',
)
const writableStream = fs.createWritable('/tmp/logo.jpg')
fileBox.pipe(writableStream)
2.3 toBase64(): Promise<string>
Get the base64 data of file.
const fileBox = FileBox.fromRemote(
'https://huan.github.io/file-box/images/file-box-logo.jpg',
)
const base64Text = await fileBox.toBase64()
console.log(base64Text)
2.4 toJSON(): string
Get the JSON.stringify
-ed text.
Not Implement Yet: Working In Progress...
const fileBox = FileBox.fromRemote(
'https://huan.github.io/file-box/images/file-box-logo.jpg',
)
const jsonText1 = fileBox.toJSON()
const jsonText2 = JSON.stringify(fileBox)
assert(jsonText1 === jsonText2)
console.log(jsonText1)
const restoredFileBox = fileBox.fromJSON(jsonText1)
restoredFileBox.toFile('/tmp/file-box-logo.jpg')
2.5 toDataURL(): Promise<string>
Get the DataURL of the file.
const fileBox = FileBox.fromFile('tests/fixtures/hello.txt')
const dataUrl = await fileBox.toDataURL()
console.log(dataUrl)
2.6 toBuffer(): Promise<Buffer>
Get the Buffer of the file.
const fileBox = FileBox.fromFile('tests/fixtures/hello.txt')
const buffer = await fileBox.toBuffer()
console.log(buffer.toString())
3. Misc
3.1 name
File name of the file in the box
const fileBox = FileBox.fromRemote(
'https://huan.github.io/file-box/images/file-box-logo.jpg',
)
console.log(fileBox.name)
3.2 metadata: Metadata { [key: string]: any }
Metadata for the file in the box. This value can only be assigned once, and will be immutable afterwards, all following assign or modify actions on metadata
will throw errors
const fileBox = FileBox.fromRemote(
'https://zixia.github.io/file-box/images/file-box-logo.jpg',
)
fileBox.metadata = {
author : 'zixia',
githubRepo : 'https://github.com/zixia/file-box',
}
console.log(fileBox.metadata)
fileBox.metadata.author = 'Thanos'
3.3 version(): string
Version of the FileBox
3.4 toJSON(): string
Serialize FileBox metadata to JSON.
To be implemented.
3.5 ready(): Promise<void>
Update the necessary internal data and make everything ready for use.
3.6 syncRemoteName(): Promise<void>
Sync the filename with the HTTP Response Header
HTTP Header Example:
Content-Disposition: attachment; filename="filename.ext"
FEATURES
- Present A File by Abstracting It's Meta Information that supports Reading & toJSON() API.
- Follow DOM File/BLOB Interface
- Present a file that could be: Local, Remote, Stream
- Lazy load
- Serializable
- Can be Transfered from server to server, server to browser.
SCHEMAS
Url
Node.js Documentation > URL Strings and URL Objects
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│ href │
├──────────┬──┬─────────────────────┬─────────────────────┬───────────────────────────┬───────┤
│ protocol │ │ auth │ host │ path │ hash │
│ │ │ ├──────────────┬──────┼──────────┬────────────────┤ │
│ │ │ │ hostname │ port │ pathname │ search │ │
│ │ │ │ │ │ ├─┬──────────────┤ │
│ │ │ │ │ │ │ │ query │ │
" https: // user : pass @ sub.host.com : 8080 /p/a/t/h ? query=string #hash "
│ │ │ │ │ hostname │ port │ │ │ │
│ │ │ │ ├──────────────┴──────┤ │ │ │
│ protocol │ │ username │ password │ host │ │ │ │
├──────────┴──┼──────────┴──────────┼─────────────────────┤ │ │ │
│ origin │ │ origin │ pathname │ search │ hash │
├─────────────┴─────────────────────┴─────────────────────┴──────────┴────────────────┴───────┤
│ href │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
Path
Node.js Documentation > path.parse(path)
┌─────────────────────┬────────────┐
│ dir │ base │
├──────┬ ├──────┬─────┤
│ root │ │ name │ ext │
" / home/user/dir / file .txt "
└──────┴──────────────┴──────┴─────┘
CHANGE LOG
v0.8 (master) (Jun 2018)
- Add two new factory methods:
fromBase64()
, fromDataURL()
- Add
toBuffer()
, toBase64()
and toDataURL()
to get the Buffer and BASE64 encoded file data - Add
metadata
property to store additional informations. (#3)
v0.4 (May 2018)
- Add
headers
option for fromRemote()
method
v0.2 (Apr 2018)
Initial version.
SEE ALSO
THANKS
This module is inspired by https://github.com/gulpjs/vinyl and https://github.com/DefinitelyTyped/DefinitelyTyped/pull/12368 when I need a virtual File module for my Chatie project.
AUTHOR
Huan LI <zixia@zixia.net>
COPYRIGHT & LICENSE
- Docs released under Creative Commons
- Code released under the Apache-2.0 License
- Code & Docs © 2018 Huan LI <zixia@zixia.net>