Package: drf-chunked-upload
drf-chunked-uploadThis 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 ofJulio Malegria,
specifically hisdjango-chunked-upload app.License:MIT-Zero.InstallationInstall via pip:pipinstalldrf-chunked-uploadAnd then add it to your DjangoINSTALLED_APPS:INSTALLED_APPS=(# ...'drf_chunked_upload',)Typical usageAn initial PUT request is sent to the url linked toChunkedUploadView(or
any subclass) with the first chunk of the file. The name of the chunk file
can be overriden in the view (class attributefield_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},)In return, the server will respond with theurlof the upload, and the
currentoffset. 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}Repeatedly PUT subsequent chunks to theurlreturned from the server.
Example:# PUT to https://your-host/<path_to_view>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cdupload_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},)Server will continue responding with theurland currentoffset.Finally, when upload is completed, POST a request to the returnedurl.
This request must include the checksum (hex) of the entire file. Example:# POST to https://your-host/<path_to_view>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cdupload_url="https://your-host/<path_to_view>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cd"r=requests.post(upload_url,data={"md5":"fc3ff98e8c6a0d3087d515c0473f8677"})If everything is OK, server will response with status code 200 and the data
returned in the methodget_response_data(if any).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 theContent-Rangeheader if uploading a whole file.If you want to see the list of pending chunked uploads, make aGETrequest to
the URL linked toChunkedUploadView(or any subclass). You will get a list of
pending chunked uploads (for the currently authenticated user only).Possible error responses:Upload has expired. Server responds 410 (Gone).iddoes 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 containContent-Rangeheader. 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).SettingsAdd any of these variables into your project settings to override them.DRF_CHUNKED_UPLOAD_EXPIRATION_DELTAHow long after creation the upload will expire.Default:datetime.timedelta(days=1)DRF_CHUNKED_UPLOAD_PATHPath where uploaded files will be stored.Default:'chunked_uploads/%Y/%m/%d'DRF_CHUNKED_UPLOAD_CHECKSUMThe 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_EXTExtension to use for completed uploads. Uploads will be renamed using this
extension on completion, unless this extension matchedDRF_CHUNKED_UPLOAD_INCOMPLETE_EXT.Default:'.done'DRF_CHUNKED_UPLOAD_INCOMPLETE_EXTExtension for in progress upload files.Default:'.part'DRF_CHUNKED_UPLOAD_STORAGE_CLASSStorage system (should be a class)Default:None(use default storage system)DRF_CHUNKED_UPLOAD_USER_RESTRICEDBoolean that determines whether only the user who created an upload can
view/continue an upload.Default:TrueDRF_CHUNKED_UPLOAD_ABSTRACT_MODELBoolean that defines if theChunkedUploadmodel will be abstract or not
(what does abstract model mean?).Default:TrueDRF_CHUNKED_UPLOAD_MAX_BYTESMax amount of data (in bytes) that can be uploaded.Nonemeans no limit.Default:NoneSupportIf you find any bug or you want to propose a new feature, please use theissues tracker. Pull requests are accepted.