{ "info": { "author": "Harel Malka", "author_email": "harel@harelmalka.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 2.0", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "=================\nS3 Chunk Uploader\n=================\n\nA Django file handler to manage piping uploaded files directly to S3 without passing through the server's file system.\nThe uploader uses multiple threads to speed up the upload of larger files.\nThis package relies on Django and Django-Storages, allowing the use of the S3 storages FileField but changes the\nupload behaviour to bypass local file system.\n\n\nQuick start\n-----------\n\n#. Install the package:\n\n pip install s3chunkuploader\n\n\n#. Set the Django FILE_UPLOAD_HANDLERS setting:\n\n FILE_UPLOAD_HANDLERS = ('s3chunkuploader.file_handler.S3FileUploadHandler',)\n\n\nHow it works\n------------\nThe File Handler intercepts the file upload multipart request at the door, and as chunks of the file are received from the\nbrowser, they are collectd into an internal queue within custom ThreadPoolWorker. When the queue surpasses a configurable\nsize (by default 5MB which is the minimum Part size for S3 multipart upload), it is submitted to the Thread Pool\nas a Future which will then resolve. Once all the chunks are uploaded and all the futures are resolved the upload is complete.\nBy default 10 threads are used which means a 100MB file upload can be potentially sent as 20 5MB parts to S3.\n\nThe FileHandler ultimately returns a 'dummy' django-storages S3Boto3StorageFile which is compatible with the storages\nS3 File Field, but was not actually used to upload a full file. The file is also enhanced with two additional attributes:\n\n original_name: The original file name uploaded\n file_size: The actual full file size uploaded\n\n\nIt is recommended to bypass csrf checks on the upload file view as the csrf check will read the POST params before the\nhandler is used.\nA replacement file field S3FileField is provided in fields.py and is satisfied with the S3 object key\n\nSettings\n--------\n\nThe following settings are expected in your Django application (only 2 are required)\n\n============================ =====================================================================================================\nSetting Description\n============================ =====================================================================================================\nAWS_ACCESS_KEY_ID Required. Your AWS access key\nAWS_SECRET_ACCESS_KEY Required. The AWS secret\nAWS_REGION Optional. Region of S3 bucket\nS3_DOCUMENT_ROOT_DIRECTORY Optional. Document root for all uploads (prefix)\nS3_APPEND_DATETIME_ON_UPLOAD Optional [True]. Appent the current datetime sring to the uploaded file name\nS3_PREFIX_QUERY_PARAM_NAME Optional [__prefix]. A query param key name which provides additional prefix for the object key on S3\nS3_MIN_PART_SIZE Optional [5MB]. The part size in bytes to upload to S3\nMAX_UPLOAD_SIZE Optional [None]. The maximum file size in bytes for an individual file.\nS3_ENDPOINT_URL Optional [None]. The s3 endpoint url which overrides the default\nCLEAN_FILE_NAME Optional [False]. When True, runs the filename through Django's slugify function to sanitise it.\n============================ =====================================================================================================\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/uktrade/s3chunkuploader", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "s3chunkuploader", "package_url": "https://pypi.org/project/s3chunkuploader/", "platform": "", "project_url": "https://pypi.org/project/s3chunkuploader/", "project_urls": { "Homepage": "https://github.com/uktrade/s3chunkuploader" }, "release_url": "https://pypi.org/project/s3chunkuploader/0.7/", "requires_dist": [ "Django", "django-storages" ], "requires_python": "", "summary": "A Django/Django-Storages threaded S3 chunk uploader", "version": "0.7" }, "last_serial": 5813912, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "5c496bcbbedfc5a8b4f88929bebf33ae", "sha256": "6fe73a2a5f359f65836b636d939637807636be2c31c6527a4463a99864240622" }, "downloads": -1, "filename": "s3chunkuploader-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5c496bcbbedfc5a8b4f88929bebf33ae", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6658, "upload_time": "2019-07-02T21:13:28", "url": "https://files.pythonhosted.org/packages/74/2a/c9f394b7b560dbc25052f845e4218ac89b3b1cfe4946565913386cb7def6/s3chunkuploader-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df3df109fcabae0374db5c5def05c7bf", "sha256": "81cd2ad704e55aaaf0abf1346db61d9c0eada456812a19575d1516d3e9bb54cc" }, "downloads": -1, "filename": "s3chunkuploader-0.1.tar.gz", "has_sig": false, "md5_digest": "df3df109fcabae0374db5c5def05c7bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5898, "upload_time": "2019-07-02T21:13:30", "url": "https://files.pythonhosted.org/packages/55/e3/2d9cdc3c5d17be102f9dd9a0de7f55a4bc7a7af8cc93e933ee6a7db5743f/s3chunkuploader-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "958e96830bacb6b4d85547da2832b603", "sha256": "7fb273c0af924810928b74fcc3175855fee656ae057af673e08b75ad33c21efb" }, "downloads": -1, "filename": "s3chunkuploader-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "958e96830bacb6b4d85547da2832b603", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7150, "upload_time": "2019-07-03T10:07:40", "url": "https://files.pythonhosted.org/packages/49/6c/4fdf0f5968206dae9492a1ba9c2c87adebdf22cb58a1c7c992c7c2e79f5c/s3chunkuploader-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7558fa714ba08e50fb170d1028fda0d1", "sha256": "813aab9aa620d960110ef0427435a34461e58f7f0c81d64f2dd4249d8b8971ce" }, "downloads": -1, "filename": "s3chunkuploader-0.2.tar.gz", "has_sig": false, "md5_digest": "7558fa714ba08e50fb170d1028fda0d1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6131, "upload_time": "2019-07-03T10:07:42", "url": "https://files.pythonhosted.org/packages/25/f7/1f71fb919d22bec84608fb340e9c821aa458aaf59064933a6f0d8ba8d99e/s3chunkuploader-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "89df1ca287f26f710eee517202d4b1fe", "sha256": "404e37da42bd38c9a7c6f99a1b1b464b6a658453547f2ac1a1fe17e9e918cb74" }, "downloads": -1, "filename": "s3chunkuploader-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "89df1ca287f26f710eee517202d4b1fe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7197, "upload_time": "2019-07-05T12:54:41", "url": "https://files.pythonhosted.org/packages/63/2c/5d750a67a4c9e82ac10f763d0213e045ec735d42526dc8520d563681d849/s3chunkuploader-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3e4f033df8f8ed6a7ece8680ef100bd4", "sha256": "00d66699a18280b6630ef7116938822d8cf32ed992ce90008f7ed833818e34cd" }, "downloads": -1, "filename": "s3chunkuploader-0.3.tar.gz", "has_sig": false, "md5_digest": "3e4f033df8f8ed6a7ece8680ef100bd4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6176, "upload_time": "2019-07-05T12:54:44", "url": "https://files.pythonhosted.org/packages/fb/ce/bb946879ac12a555a158e26db5cd75a538c908830346487c1c8e72b8dba9/s3chunkuploader-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "2d8e4d893bf9d5977282257aaa8d38d5", "sha256": "eebbc9a18d57f94dd2602661806d8fc004d87e2f5ff7f1dcb3fe603b614ab8fb" }, "downloads": -1, "filename": "s3chunkuploader-0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "2d8e4d893bf9d5977282257aaa8d38d5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7326, "upload_time": "2019-07-08T10:16:30", "url": "https://files.pythonhosted.org/packages/4b/69/c666ed1028f97624d8f876eb46e339209f0391ac85227201dc02ffe2ad3a/s3chunkuploader-0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "99fe9f2c0084d7904a354e4ae5219e13", "sha256": "5e5b3a03688ee589878b73a5833e764dac6e694b916022293769ba455c010c38" }, "downloads": -1, "filename": "s3chunkuploader-0.4.tar.gz", "has_sig": false, "md5_digest": "99fe9f2c0084d7904a354e4ae5219e13", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6304, "upload_time": "2019-07-08T10:16:34", "url": "https://files.pythonhosted.org/packages/2b/29/1bed1112cd9104cea47b44a86a2e5e3e3ea7b55b2740af74b60beda18ba2/s3chunkuploader-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "5ef7ef89a9a8ad7ff4fbd0e86b3b1ac4", "sha256": "d7e74f0a72f154815f8f807bf1b28b5cdcb49a407eb4535617292d97fb4007aa" }, "downloads": -1, "filename": "s3chunkuploader-0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "5ef7ef89a9a8ad7ff4fbd0e86b3b1ac4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8666, "upload_time": "2019-07-18T12:10:19", "url": "https://files.pythonhosted.org/packages/1e/4e/cdd53ee29a01c2e7ca8b79f082c1de5ed753fde53b4fe7fdaf210a285397/s3chunkuploader-0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c8ffa053ba940d87e0ee9833a4bd3cf0", "sha256": "a7c4e38e62f0582f25661c5cef6c8fc381d6394d19ea75e8c83c88957e016999" }, "downloads": -1, "filename": "s3chunkuploader-0.5.tar.gz", "has_sig": false, "md5_digest": "c8ffa053ba940d87e0ee9833a4bd3cf0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6296, "upload_time": "2019-07-18T12:10:26", "url": "https://files.pythonhosted.org/packages/49/02/2abba56e0511118d9a884cb617fdae38da90227f709c4785b85ce960cc72/s3chunkuploader-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "42f140fc728002550c3a56b20a4c9e2a", "sha256": "ab6ae18657dac53f0c04b9274461d430a77c5cf5089b6e41c22edf0f7224e6ce" }, "downloads": -1, "filename": "s3chunkuploader-0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "42f140fc728002550c3a56b20a4c9e2a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8804, "upload_time": "2019-07-18T18:04:21", "url": "https://files.pythonhosted.org/packages/62/68/ff000de8089b9cc5e4ec8ae1270fa2c07723e8e905760ee9d8ff9eab287f/s3chunkuploader-0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "127d2d7a0a6e73e5a2491cfc071d94c3", "sha256": "d163a4c94ffdeeb69d12a807f7986e300b14e71ef847e0033c31769e0629c74b" }, "downloads": -1, "filename": "s3chunkuploader-0.6.tar.gz", "has_sig": false, "md5_digest": "127d2d7a0a6e73e5a2491cfc071d94c3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6397, "upload_time": "2019-07-18T18:04:26", "url": "https://files.pythonhosted.org/packages/25/63/9a349dc662b52a602d7888585fa94baf06cba35908de808bd637aad02866/s3chunkuploader-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "1ad8f50b2cd1de7b7295e26c07810933", "sha256": "42be99dce0a484e41f522897a45b736e324d1603325ca1727c28a2f97c373128" }, "downloads": -1, "filename": "s3chunkuploader-0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "1ad8f50b2cd1de7b7295e26c07810933", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8959, "upload_time": "2019-09-11T09:22:58", "url": "https://files.pythonhosted.org/packages/d0/cd/5512412f84f6c404bcaa41eb70a2e43ff5b130871a1b0578282ec11d7fc3/s3chunkuploader-0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7a4ef635ae3f6aba42da3b0f5d66fae9", "sha256": "a80197a87bd10537032f51548fd06a8d49f5917ca1be650aac4635dc8e8747d5" }, "downloads": -1, "filename": "s3chunkuploader-0.7.tar.gz", "has_sig": false, "md5_digest": "7a4ef635ae3f6aba42da3b0f5d66fae9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6488, "upload_time": "2019-09-11T09:23:00", "url": "https://files.pythonhosted.org/packages/66/f8/ce1d00ad516b41efec687f54d6cf1f1cd2d6d93ae75aa25f71845e713beb/s3chunkuploader-0.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1ad8f50b2cd1de7b7295e26c07810933", "sha256": "42be99dce0a484e41f522897a45b736e324d1603325ca1727c28a2f97c373128" }, "downloads": -1, "filename": "s3chunkuploader-0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "1ad8f50b2cd1de7b7295e26c07810933", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8959, "upload_time": "2019-09-11T09:22:58", "url": "https://files.pythonhosted.org/packages/d0/cd/5512412f84f6c404bcaa41eb70a2e43ff5b130871a1b0578282ec11d7fc3/s3chunkuploader-0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7a4ef635ae3f6aba42da3b0f5d66fae9", "sha256": "a80197a87bd10537032f51548fd06a8d49f5917ca1be650aac4635dc8e8747d5" }, "downloads": -1, "filename": "s3chunkuploader-0.7.tar.gz", "has_sig": false, "md5_digest": "7a4ef635ae3f6aba42da3b0f5d66fae9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6488, "upload_time": "2019-09-11T09:23:00", "url": "https://files.pythonhosted.org/packages/66/f8/ce1d00ad516b41efec687f54d6cf1f1cd2d6d93ae75aa25f71845e713beb/s3chunkuploader-0.7.tar.gz" } ] }