upchunk-fetch v0.1.13
UpChunk uploads chunks of files! It's a JavaScript module for handling large file uploads via chunking and making a put request for each chunk with the correct range request headers. Uploads can be paused and resumed, they're fault tolerant,
and it should work just about anywhere.
UpChunk supports resumable uploads. This library will:
- Split a file into chunks (in multiples of 256KB).
- Make a
PUTrequest for each chunk, specifying the correctContent-LengthandContent-Rangeheaders for each one. - Retry a chunk upload on failures.
- Allow for pausing and resuming an upload.
Installation
NPM
npm install upchunk-fetchYarn
yarn add upchunk-fetchScript Tags
<script src="https://unpkg.com/upchunk-fetch"></script>Basic Usage
Getting an upload URL from Mux.
You'll need to have a route in your application that returns an upload URL from Mux. If you're using the Mux Node SDK, you might do something that looks like this.
import * as UpChunk from 'upchunk-fetch';
// Pretend you have an HTML page with an input like: <input id="picker" type="file" />
const picker = document.getElementById('picker');
picker.onchange = () => {
const getUploadUrl = () =>
fetch('/the-endpoint-above').then(res =>
res.ok ? res.text() : throw new Error('Error getting an upload URL :(')
);
const upload = UpChunk.createUpload({
endpoint: getUploadUrl,
file: picker.files[0],
chunkSize: 30720, // Uploads the file in ~30 MB chunks
});
// subscribe to events
upload.on('error', err => {
console.error('π₯ π', err.detail);
});
upload.on('progress', progress => {
console.log(`So far we've uploaded ${progress.detail}% of this file.`);
});
upload.on('success', () => {
console.log("Wrap it up, we're done here. π");
});
};Or, in the browser with React
import React, { useState } from 'react';
import * as UpChunk from 'upchunk-fetch';
function Page() {
const [progress, setProgress] = useState(0);
const [statusMessage, setStatusMessage] = useState(null);
const handleUpload = async (inputRef) => {
try {
const response = await fetch('/your-server-endpoint', { method: 'POST' });
const url = await response.text();
const upload = UpChunk.createUpload({
endpoint: url, // Authenticated url
file: inputRef.files[0], // File object with your video fileβs properties
chunkSize: 30720, // Uploads the file in ~30 MB chunks
});
// Subscribe to events
upload.on('error', error => {
setStatusMessage(error.detail);
});
upload.on('progress', progress => {
setProgress(progress.detail);
});
upload.on('success', () => {
setStatusMessage("Wrap it up, we're done here. π");
});
} catch (error) {
setErrorMessage(error);
}
}
return (
<div className="page-container">
<h1>File upload button</h1>
<label htmlFor="file-picker">Select a video file:</label>
<input type="file" onChange={(e) => handleUpload(e.target)}
id="file-picker" name="file-picker"/ >
<label htmlFor="upload-progress">Downloading progress:</label>
<progress value={progress} max="100"/>
<em>{statusMessage}</em>
</div>
);
}
export default Page;API
createUpload(options)
Returns an instance of UpChunk and begins uploading the specified File.
options object parameters
endpointtype:string|function(required)URL to upload the file to. This can be either a string of the authenticated URL to upload to, or a function that returns a promise that resolves that URL string. The function will be passed the
fileas a parameter.filetype:File(required)The file you'd like to upload. For example, you might just want to use the file from an input with a type of "file".
headerstype:Object|functionAn object, a function that returns an object, or a function that returns a promise of an object. The resulting object contains any headers you'd like included with the
PUTrequest for each chunk.chunkSizetype:integer, default:30720The size in kB of the chunks to split the file into, with the exception of the final chunk which may be smaller. This parameter must be in multiples of 256.
maxFileSizetype:integerThe maximum size of the file in kb of the input file to be uploaded. The maximum size can technically be smaller than the chunk size, and in that case there would be exactly one chunk.
attemptstype:integer, default:5The number of times to retry any given chunk.
delayBeforeAttempttype:integer, default:1The time in seconds to wait before attempting to upload a chunk again.
methodtype:"PUT" | "PATCH" | "POST", default:PUTThe HTTP method to use when uploading each chunk.
dynamicChunkSizetype:boolean, default:falseWhether or not the system should dynamically scale the
chunkSizeup and down to adjust to network conditions.maxChunkSizetype:integer, default:512000When
dynamicChunkSizeistrue, the largest chunk size that will be used, in kB.minChunkSizetype:integer, default:256When
dynamicChunkSizeistrue, the smallest chunk size that will be used, in kB.
UpChunk Instance Methods
pause()Pauses an upload after the current in-flight chunk is finished uploading.
resume()Resumes an upload that was previously paused.
abort()The same behavior as
pause(), but also aborts the in-flight XHR request.
UpChunk Instance Events
Events are fired with a CustomEvent object. The detail key is null if an interface isn't specified.
attempt{ detail: { chunkNumber: Integer, chunkSize: Integer } }Fired immediately before a chunk upload is attempted.
chunkNumberis the number of the current chunk being attempted, andchunkSizeis the size (in bytes) of that chunk.attemptFailure{ detail: { message: String, chunkNumber: Integer, attemptsLeft: Integer } }Fired when an attempt to upload a chunk fails.
chunkSuccess{ detail: { chunk: Integer, attempts: Integer, response: XhrResponse } }Fired when an indvidual chunk is successfully uploaded.
error{ detail: { message: String, chunkNumber: Integer, attempts: Integer } }Fired when a chunk has reached the max number of retries or the response code is fatal and implies that retries should not be attempted.
offlineFired when the client has gone offline.
onlineFired when the client has gone online.
progress{ detail: [0..100] }Fired continuously with incremental upload progress. This returns the current percentage of the file that's been uploaded.
successFired when the upload is finished successfully.
FAQ
How do I cancel an upload?
Our typical suggestion is to use pause() or abort(), and then clean up the UpChunk instance however you'd like. For example, you could do something like this:
// upload is an UpChunk instance currently in-flight
upload.abort();
// In many cases, just `abort` should be fine assuming the instance will get picked up by garbage collection
// If you want to be sure, you can manually delete the instance.
delete upload;Credit
Upchunk=fetch was forked from the mux repository and authored by Matthew McClure m@mux.com .
The original idea for this came from the awesome huge uploader project, which is what you need if you're looking to do multipart form data uploads. π
Also, @gabrielginter ported upchunk to Flutter.