Skip to main content

Upload large files to Django REST Framework in multiple chunks, with the ability to resume if the upload is interrupted.

Project description

drf-chunked-upload

build-status-image coverage-status-image pypi-version

This simple django app enables users to upload large files to Django Rest Framework in multiple chunks, with the ability to resume if the upload is interrupted.

This app is based to a large degree on the work of Julio Malegria, specifically his django-chunked-upload app.

License: MIT-Zero.

Installation

Install via pip:

pip install drf-chunked-upload

And then add it to your Django INSTALLED_APPS:

INSTALLED_APPS = (
    # ...
    'drf_chunked_upload',
)

Typical usage

  1. An initial PUT request is sent to the url linked to ChunkedUploadView (or any subclass) with the first chunk of the file. The name of the chunk file can be overriden in the view (class attribute field_name). Example:
r = requests.put(
    upload_url,
    headers={
        "Content-Range": "bytes {}-{}/{}".format(index, index + size - 1, total),
    },
    data={"filename": build_file},
    files={'file': chunk_data},
)
  1. In return, the server will respond with the url of the upload, and the current offset. Example:
{
    'id': 'f64ebd67-83a3-45b6-8acd-c749ea1ed4cd'
    'url': 'https://your-host/<path_to_view>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cd',
    'file': 'https://your-host/<path_to_file>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cd.part',
    'filename': 'example.bin',
    'offset': 10000,
    `created_at`: '2021-05-18T17:12:50.318718Z',
    'status': 1,
    'completed_at': None,
    'user': 1
}
  1. Repeatedly PUT subsequent chunks to the url returned from the server. Example:
# PUT to https://your-host/<path_to_view>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cd
upload_url = "https://your-host/<path_to_view>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cd"
r = requests.put(
    upload_url,
    headers={
        "Content-Range": "bytes {}-{}/{}".format(index, index + size - 1, total),
    },
    data={"filename": build_file},
    files={'file': chunk_data},
)
  1. Server will continue responding with the url and current offset.
  2. Finally, when upload is completed, POST a request to the returned url. This request must include the checksum (hex) of the entire file. Example:
# POST to https://your-host/<path_to_view>/5230ec1f59d1485d9d7974b853802e31
upload_url = "https://your-host/<path_to_view>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cd"
r = requests.put(upload_url, data={"md5": "fc3ff98e8c6a0d3087d515c0473f8677"})
  1. If everything is OK, server will response with status code 200 and the data returned in the method get_response_data (if any).
  2. If you want to upload a file as a single chunk, this is also possible! Simply make the first request a POST and include the checksum digest for the file. You don't need to include the Content-Range header if uploading a whole file.

Possible error responses:

  • Upload has expired. Server responds 410 (Gone).
  • id does not match any upload. Server responds 404 (Not found).
  • No chunk file is found in the indicated key. Server responds 400 (Bad request).
  • Request does not contain Content-Range header. Server responds 400 (Bad request).
  • Size of file exceeds limit (if specified). Server responds 400 (Bad request).
  • Offsets do not match. Server responds 400 (Bad request).
  • Checksums do not match. Server responds 400 (Bad request).

Settings

Add any of these variables into your project settings to override them.

DRF_CHUNKED_UPLOAD_EXPIRATION_DELTA

  • How long after creation the upload will expire.
  • Default: datetime.timedelta(days=1)

DRF_CHUNKED_UPLOAD_PATH

  • Path where uploaded files will be stored.
  • Default: 'chunked_uploads/%Y/%m/%d'

DRF_CHUNKED_UPLOAD_CHECKSUM

  • The type of checksum to use when verifying checksums. Options include anything supported by Python's hashlib (md5, sha1, sha256, etc)
  • Default: 'md5'

DRF_CHUNKED_UPLOAD_COMPLETE_EXT

  • Extension to use for completed uploads. Uploads will be renamed using this extension on completion, unless this extension matched DRF_CHUNKED_UPLOAD_INCOMPLETE_EXT.
  • Default: '.done'

DRF_CHUNKED_UPLOAD_INCOMPLETE_EXT

  • Extension for in progress upload files.
  • Default: '.part'

DRF_CHUNKED_UPLOAD_STORAGE_CLASS

  • Storage system (should be a class)
  • Default: None (use default storage system)

DRF_CHUNKED_UPLOAD_USER_RESTRICED

  • Boolean that determines whether only the user who created an upload can view/continue an upload.
  • Default: True

DRF_CHUNKED_UPLOAD_ABSTRACT_MODEL

DRF_CHUNKED_UPLOAD_MAX_BYTES

  • Max amount of data (in bytes) that can be uploaded. None means no limit.
  • Default: None

Support

If you find any bug or you want to propose a new feature, please use the issues tracker. Pull requests are also accepted.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

drf-chunked-upload-0.5.0.tar.gz (13.8 kB view details)

Uploaded Source

Built Distribution

drf_chunked_upload-0.5.0-py3-none-any.whl (14.0 kB view details)

Uploaded Python 3

File details

Details for the file drf-chunked-upload-0.5.0.tar.gz.

File metadata

  • Download URL: drf-chunked-upload-0.5.0.tar.gz
  • Upload date:
  • Size: 13.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.6

File hashes

Hashes for drf-chunked-upload-0.5.0.tar.gz
Algorithm Hash digest
SHA256 c352fc349da92b6db35c032250fa88a42f3ab8a643def38f6a753f6d613667bb
MD5 8ce7ac7c74a0b3d61f7ddc71212d893d
BLAKE2b-256 34699113b18e73b8d02f0cbc94b423911cb23ace32cdb797540dbd1647714ac4

See more details on using hashes here.

File details

Details for the file drf_chunked_upload-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: drf_chunked_upload-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 14.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.6

File hashes

Hashes for drf_chunked_upload-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8adfb95243e63e380865d7afe90a342224bbca6aa9dfb74467ddc7eb6f4885c1
MD5 f227dc0c80b907855bb9696037582d61
BLAKE2b-256 a4ee34ca07776bc88a05bca9fea7da388d783d7b391a9dbecf22d42d05ae8c33

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page