Hook for working with resumable.js

resumablejs, flask, resumable, resumable-upload
pip install python-resumable==0.1.2



Well, in order to explain what is Python-resumable we have to explain what is ResumableJS. ResumableJS is a JavaScript library providing multiple simultaneous, stable and resumable uploads via the HTML5 File API. And python-resumable is a universal hookup for resumablejs. We'd like to create an interface that works regardless of which framework you use.

It has a universal hookup, that takes chunks as base64 strings, and currently it has a Flask-specific hookup that takes Flask file objects. We'd like to add Pyramid and Django hooks.


Simple as that:

pip install python_resumable


It's rather simple to use. It has to take 5 Resumable headers, your upload and tmp directory and file data as well.

Here's a simple Flask example.

from flask import Flask, request, jsonify
from python_resumable import FlaskUploader

app = Flask(__name__)

@app.route('/uploads', methods=['GET'])
def check_status():
    """This route works with get checks from resumable"""

    resumable_dict = {
        'resumableIdentifier': request.args.get('resumableIdentifier'),
        'resumableFilename': request.args.get('resumableFilename'),
        'resumableTotalSize': request.args.get('resumableTotalSize'),
        'resumableTotalChunks': request.args.get('resumableTotalChunks'),
        'resumableChunkNumber': request.args.get('resumableChunkNumber')

    resumable = FlaskUploader(resumable_dict,

    if resumable.chunk.exists() is True:
        return jsonify({"chunkUploadStatus": True})

    return jsonify({"chunkUploadStatus": False}), 204

@app.route('/uploads', methods=['POST'])
def upload_file():

    resumable_dict = {
        'resumableIdentifier': request.form.get('resumableIdentifier'),
        'resumableFilename': request.form.get('resumableFilename'),
        'resumableTotalSize': request.form.get('resumableTotalSize'),
        'resumableTotalChunks': request.form.get('resumableTotalChunks'),
        'resumableChunkNumber': request.form.get('resumableChunkNumber')

    resumable = FlaskUploader(resumable_dict,

    if resumable.check_status() is True:
        return jsonify({"fileUploadStatus": True,
                        "resumableIdentifier": resumable.repo.file_id})

    return jsonify({"chunkUploadStatus": True,
                    "resumableIdentifier": resumable.repo.file_id})

Well... As simple as it could actually get with Resumable.


This package provides you with two usable classes -- Uploader and FlaskUploader. They are essentially identical, except for the type of chunk-data they take.

Arguments on creation:

  • resumable_dict: contains Resumable data in a dictionary form, namely: 'resumableIdentifier', 'resumableFilename', 'resumableTotalSize', 'resumableTotalChunks', 'resumableChunkNumber'
  • upload_dir: contains path to your final directory where the file will be assembled.
  • tmp_dir: contains path to temporary directory, where it will store the chunks.
  • chunk_data: contains data transfered with the chunk. Uploader takes generic b64 strings, FlaskUploader takes Flask file objects.


  • Chunk: Stores chunk-related data. For full inforamtion -- refer to the full reference.
  • Repository: Stores data related to the end file. For full inforamtion -- refer to the full reference.


  • upload_chunk: If chunk already exists returns False, else saves chunk to tmp_dir/resumableId/chunk_name and returns True.
  • check_status: If all chunks are in tmp returns True, else returns False.
  • assemble_chunks: Assembles all of the chunks in your upload_dir. If filename is not specified uses resumableFilename.
  • cleanup: Deletes all the data from tmp_dir/resumableId.

Full reference can be found in docstrings.