blob-util vs file-saver vs download vs js-file-download vs downloadjs
JavaScript File Download Libraries Comparison
1 Year
blob-utilfile-saverdownloadjs-file-downloaddownloadjsSimilar Packages:
What's JavaScript File Download Libraries?

These libraries provide various utilities for downloading files in web applications. They simplify the process of creating downloadable content, handling Blob objects, and managing file downloads across different browsers. Each library has its own strengths and use cases, making them suitable for different scenarios in web development.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
blob-util5,257,203504-37 years agoApache-2.0
file-saver3,513,60121,769-2104 years agoMIT
download1,984,3481,292-665 years agoMIT
js-file-download660,887921-105 years agoMIT
downloadjs317,9102,301-498 years agoMIT
Feature Comparison: blob-util vs file-saver vs download vs js-file-download vs downloadjs

Blob Handling

  • blob-util:

    blob-util provides a comprehensive set of utilities for creating and manipulating Blob objects. It allows for easy conversion of strings, arrays, and other data types into Blobs, making it ideal for applications that generate files dynamically in the browser.

  • file-saver:

    file-saver excels in handling Blob objects and provides a consistent API for saving them as files. It supports various file types and ensures compatibility across different browsers, making it a go-to choice for Blob handling.

  • download:

    download does not focus on Blob manipulation but rather on triggering downloads directly from URLs or data URIs. It is not designed for extensive Blob handling but can work with Blob URLs if provided.

  • js-file-download:

    js-file-download is designed for simplicity and allows for easy downloading of Blob objects. It provides a minimalistic approach to Blob handling, making it suitable for simple use cases.

  • downloadjs:

    downloadjs allows for downloading Blob objects by converting them into downloadable files. It provides a straightforward API for handling Blob downloads, making it suitable for applications that need to download generated content.

Ease of Use

  • blob-util:

    blob-util is user-friendly and provides clear methods for converting data to Blobs and creating object URLs. Its API is intuitive, making it easy for developers to integrate into their applications.

  • file-saver:

    file-saver has a well-documented API that is easy to understand. It provides clear methods for saving files, making it accessible for developers of all skill levels.

  • download:

    download is extremely easy to use, requiring minimal setup to trigger downloads. It is ideal for developers who want a quick solution without complex configurations.

  • js-file-download:

    js-file-download is designed for simplicity, allowing developers to implement file downloads with just a few lines of code. Its minimalistic approach makes it very user-friendly.

  • downloadjs:

    downloadjs offers a straightforward API that simplifies the process of downloading files. It is easy to implement and requires little effort to get started, making it suitable for quick projects.

Browser Compatibility

  • blob-util:

    blob-util is compatible with modern browsers and provides fallbacks for older versions, ensuring that Blob manipulation works across a wide range of environments.

  • file-saver:

    file-saver is known for its excellent browser compatibility, including support for Internet Explorer. It handles file downloads gracefully across different platforms.

  • download:

    download is compatible with most modern browsers and provides a simple way to trigger downloads without worrying about compatibility issues.

  • js-file-download:

    js-file-download works well in modern browsers and is designed to provide a seamless experience for downloading files, ensuring compatibility across platforms.

  • downloadjs:

    downloadjs is designed to work across all modern browsers and handles various data types, ensuring a consistent download experience regardless of the browser used.

File Type Support

  • blob-util:

    blob-util can handle various data types and convert them into Blobs, making it versatile for generating different file types dynamically.

  • file-saver:

    file-saver supports a wide range of file types, including images, text, and binary files. It is ideal for applications that require saving diverse file formats.

  • download:

    download supports downloading files from URLs or data URIs, but it does not provide extensive support for different file types beyond what is specified in the URL.

  • js-file-download:

    js-file-download is designed to handle basic file types effectively, allowing for easy downloads of text and JSON data.

  • downloadjs:

    downloadjs supports downloading text, JSON, and Blob data, making it suitable for applications that need to download various file formats easily.

Use Cases

  • blob-util:

    blob-util is best suited for applications that need to generate files on the fly, such as image editors or data visualization tools that export charts as images.

  • file-saver:

    file-saver is perfect for applications that require robust file saving capabilities, such as document editors or file management systems that need to support various file types.

  • download:

    download is ideal for simple applications that need to trigger downloads from static URLs or data URIs without additional complexity.

  • js-file-download:

    js-file-download is great for quick projects where developers need a straightforward solution for downloading files without additional dependencies.

  • downloadjs:

    downloadjs is suitable for applications that need to download generated content, such as exporting user data or reports in JSON format.

How to Choose: blob-util vs file-saver vs download vs js-file-download vs downloadjs
  • blob-util:

    Choose blob-util if you need a library that provides utilities for working with Blob objects, including converting data to Blobs and creating object URLs. It is particularly useful for applications that generate files dynamically in the browser.

  • file-saver:

    Choose file-saver if you need a robust solution for saving files on the client-side. It supports a wide range of file types and provides a consistent API for saving files across different browsers, making it ideal for applications that handle complex file downloads.

  • download:

    Choose download if you want a lightweight library that simplifies the process of triggering file downloads. It is straightforward to use and works well for basic download needs without additional features.

  • js-file-download:

    Choose js-file-download if you want a minimalistic approach to downloading files with a focus on simplicity and ease of use. It is a great choice for developers looking for a straightforward way to implement file downloads without additional dependencies.

  • downloadjs:

    Choose downloadjs if you require a simple and effective solution for downloading files with support for various data types. It is particularly useful for applications that need to download text or JSON data as files.

README for blob-util

blob-util Build Status TypeScript

blob-util is a Blob library for busy people.

It offers a small set of cross-browser utilities for translating Blobs to and from different formats:

  • <img/> tags
  • base 64 strings
  • binary strings
  • ArrayBuffers
  • data URLs
  • canvas

It's also a good pairing with the attachment API in PouchDB.

Note: this is a browser library. For Node.js, see Buffers.

Topics:

Install

Via npm:

npm install blob-util

ES modules are supported:

import { canvasToBlob } from 'blob-util'
canvasToBlob(canvas, 'image/png').then(/* ... */)

Or as a script tag:

<script src="https://unpkg.com/blob-util/dist/blob-util.min.js"></script>

Then it's available as a global blobUtil object:

blobUtil.canvasToBlob(canvas, 'image/png').then(/* ... */)

Browser support

As of v2.0.0, a built-in Promise polyfill is no longer provided. Assuming you provide a Promise polyfill, the supported browsers are:

  • Firefox
  • Chrome
  • Edge
  • IE 10+
  • Safari 6+
  • iOS 6+
  • Android 4+
  • Any browser with either Blob or the older BlobBuilder; see caniuse for details.

Tutorial

Blobs (binary large objects) are the modern way of working with binary data in the browser. The browser support is very good.

Once you have a Blob, you can make it available offline by storing it in IndexedDB, PouchDB, LocalForage, or other in-browser databases. So it's the perfect format for working with offline images, sound, and video.

A File is also a Blob. So if you have an <input type="file"> in your page, you can let your users upload any file and then work with it as a Blob.

Example

Here's Kirby. He's a famous little Blob.

Kirby

So let's fulfill his destiny, and convert him to a real Blob object.

var img = document.getElementById('kirby');

blobUtil.imgSrcToBlob(img.src).then(function (blob) {
  // ladies and gents, we have a blob
}).catch(function (err) {
  // image failed to load
});

(Don't worry, this won't download the image twice, because browsers are smart.)

Now that we have a Blob, we can convert it to a URL and use that as the source for another <img/> tag:

var blobURL = blobUtil.createObjectURL(blob);

var newImg = document.createElement('img');
newImg.src = blobURL;

document.body.appendChild(newImg);

So now we have two Kirbys - one with a normal URL, and the other with a blob URL. You can try this out yourself in the blob-util playground. Super fun!

API

Index

Functions


Functions

arrayBufferToBinaryString

arrayBufferToBinaryString(buffer: ArrayBuffer): string

Convert an ArrayBuffer to a binary string.

Example:

var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | buffer | ArrayBuffer | array buffer |

Returns: string binary string


arrayBufferToBlob

arrayBufferToBlob(buffer: ArrayBuffer, type?: string): Blob

Convert an ArrayBuffer to a Blob.

Example:

var blob = blobUtil.arrayBufferToBlob(arrayBuff, 'audio/mpeg');

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | buffer | ArrayBuffer | - | | Optional type | string | the content type (optional) |

Returns: Blob Blob


base64StringToBlob

base64StringToBlob(base64: string, type?: string): Blob

Convert a base64-encoded string to a Blob.

Example:

var blob = blobUtil.base64StringToBlob(base64String);

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | base64 | string | base64-encoded string | | Optional type | string | the content type (optional) |

Returns: Blob Blob


binaryStringToArrayBuffer

binaryStringToArrayBuffer(binary: string): ArrayBuffer

Convert a binary string to an ArrayBuffer.

var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | binary | string | binary string |

Returns: ArrayBuffer array buffer


binaryStringToBlob

binaryStringToBlob(binary: string, type?: string): Blob

Convert a binary string to a Blob.

Example:

var blob = blobUtil.binaryStringToBlob(binaryString);

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | binary | string | binary string | | Optional type | string | the content type (optional) |

Returns: Blob Blob


blobToArrayBuffer

blobToArrayBuffer(blob: Blob): Promise<ArrayBuffer>

Convert a Blob to an ArrayBuffer.

Example:

blobUtil.blobToArrayBuffer(blob).then(function (arrayBuff) {
  // success
}).catch(function (err) {
  // error
});

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | blob | Blob | - |

Returns: Promise<ArrayBuffer> Promise that resolves with the ArrayBuffer


blobToBase64String

blobToBase64String(blob: Blob): Promise<string>

Convert a Blob to a binary string.

Example:

blobUtil.blobToBase64String(blob).then(function (base64String) {
  // success
}).catch(function (err) {
  // error
});

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | blob | Blob | - |

Returns: Promise<string> Promise that resolves with the binary string


blobToBinaryString

blobToBinaryString(blob: Blob): Promise<string>

Convert a Blob to a binary string.

Example:

blobUtil.blobToBinaryString(blob).then(function (binaryString) {
  // success
}).catch(function (err) {
  // error
});

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | blob | Blob | - |

Returns: Promise<string> Promise that resolves with the binary string


blobToDataURL

blobToDataURL(blob: Blob): Promise<string>

Convert a Blob to a data URL string (e.g. 'data:image/png;base64,iVBORw0KG...').

Example:

var dataURL = blobUtil.blobToDataURL(blob);

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | blob | Blob | - |

Returns: Promise<string> Promise that resolves with the data URL string


canvasToBlob

canvasToBlob(canvas: HTMLCanvasElement, type?: string, quality?: number): Promise<Blob>

Convert a canvas to a Blob.

Examples:

blobUtil.canvasToBlob(canvas).then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

Most browsers support converting a canvas to both 'image/png' and 'image/jpeg'. You may also want to try 'image/webp', which will work in some browsers like Chrome (and in other browsers, will just fall back to 'image/png'):

blobUtil.canvasToBlob(canvas, 'image/webp').then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | canvas | HTMLCanvasElement | HTMLCanvasElement | | Optional type | string | the content type (optional, defaults to 'image/png') | | Optional quality | number | a number between 0 and 1 indicating image quality if the requested type is 'image/jpeg' or 'image/webp' |

Returns: Promise<Blob> Promise that resolves with the Blob


createBlob

createBlob(parts: Array<any>, properties?: * BlobPropertyBag | string*): Blob

Shim for new Blob() to support older browsers that use the deprecated BlobBuilder API.

Example:

var myBlob = blobUtil.createBlob(['hello world'], {type: 'text/plain'});

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | parts | Array<any> | content of the Blob | | Optional properties | BlobPropertyBag | string| usually {type: myContentType}, you can also pass a string for the content type |

Returns: Blob Blob


createObjectURL

createObjectURL(blob: Blob): string

Shim for URL.createObjectURL() to support browsers that only have the prefixed webkitURL (e.g. Android <4.4).

Example:

var myUrl = blobUtil.createObjectURL(blob);

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | blob | Blob | - |

Returns: string url


dataURLToBlob

dataURLToBlob(dataURL: string): Blob

Convert a data URL string (e.g. 'data:image/png;base64,iVBORw0KG...') to a Blob.

Example:

var blob = blobUtil.dataURLToBlob(dataURL);

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | dataURL | string | dataURL-encoded string |

Returns: Blob Blob


imgSrcToBlob

imgSrcToBlob(src: string, type?: string, crossOrigin?: string, quality?: number): Promise<Blob>

Convert an image's src URL to a Blob by loading the image and painting it to a canvas.

Note: this will coerce the image to the desired content type, and it will only paint the first frame of an animated GIF.

Examples:

blobUtil.imgSrcToBlob('http://mysite.com/img.png').then(function (blob) {
  // success
}).catch(function (err) {
  // error
});
blobUtil.imgSrcToBlob('http://some-other-site.com/img.jpg', 'image/jpeg',
                         'Anonymous', 1.0).then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | src | string | image src | | Optional type | string | the content type (optional, defaults to 'image/png') | | Optional crossOrigin | string | for CORS-enabled images, set this to 'Anonymous' to avoid "tainted canvas" errors | | Optional quality | number | a number between 0 and 1 indicating image quality if the requested type is 'image/jpeg' or 'image/webp' |

Returns: Promise<Blob> Promise that resolves with the Blob


imgSrcToDataURL

imgSrcToDataURL(src: string, type?: string, crossOrigin?: string, quality?: number): Promise<string>

Convert an image's src URL to a data URL by loading the image and painting it to a canvas.

Note: this will coerce the image to the desired content type, and it will only paint the first frame of an animated GIF.

Examples:

blobUtil.imgSrcToDataURL('http://mysite.com/img.png').then(function (dataURL) {
  // success
}).catch(function (err) {
  // error
});
blobUtil.imgSrcToDataURL('http://some-other-site.com/img.jpg', 'image/jpeg',
                         'Anonymous', 1.0).then(function (dataURL) {
  // success
}).catch(function (err) {
  // error
});

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | src | string | image src | | Optional type | string | the content type (optional, defaults to 'image/png') | | Optional crossOrigin | string | for CORS-enabled images, set this to 'Anonymous' to avoid "tainted canvas" errors | | Optional quality | number | a number between 0 and 1 indicating image quality if the requested type is 'image/jpeg' or 'image/webp' |

Returns: Promise<string> Promise that resolves with the data URL string


revokeObjectURL

revokeObjectURL(url: string): void

Shim for URL.revokeObjectURL() to support browsers that only have the prefixed webkitURL (e.g. Android <4.4).

Example:

blobUtil.revokeObjectURL(myUrl);

Parameters:

| Param | Type | Description | | ------ | ------ | ------ | | url | string | |

Returns: void


Credits

Thanks to the rest of the PouchDB team for figuring most of this crazy stuff out.

Building the library

npm install
npm run build

Testing the library

npm install

Then to test in the browser using Saucelabs:

npm test

Or to test locally in your browser of choice:

npm run test-local

To build the API docs and insert them in the README:

npm run doc