From d61e8749539117cc5b4374c70ec540db42146e07 Mon Sep 17 00:00:00 2001 From: Benjamin Toueg Date: Tue, 13 Sep 2016 19:14:55 +0200 Subject: [PATCH 1/2] Add support for files > 5 gb with S3BotoStorage Fixes https://github.com/jschneier/django-storages/issues/194 --- storages/backends/s3boto3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storages/backends/s3boto3.py b/storages/backends/s3boto3.py index 0124c65b8..505850b0c 100644 --- a/storages/backends/s3boto3.py +++ b/storages/backends/s3boto3.py @@ -462,7 +462,7 @@ def _save_content(self, obj, content, parameters): if self.default_acl: put_parameters['ACL'] = self.default_acl content.seek(0, os.SEEK_SET) - obj.put(Body=content, **put_parameters) + obj.upload_fileobj(content, ExtraArgs=put_parameters) def delete(self, name): name = self._normalize_name(self._clean_name(name)) From 038e69b69a1d92a30c6e234410edd254a10c8e8b Mon Sep 17 00:00:00 2001 From: Benjamin Toueg Date: Wed, 14 Sep 2016 00:14:17 +0200 Subject: [PATCH 2/2] Fix tests --- tests/test_s3boto3.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tests/test_s3boto3.py b/tests/test_s3boto3.py index fbfdfdeae..ddedcf847 100644 --- a/tests/test_s3boto3.py +++ b/tests/test_s3boto3.py @@ -118,10 +118,12 @@ def test_storage_save(self): self.storage.bucket.Object.assert_called_once_with(name) obj = self.storage.bucket.Object.return_value - obj.put.assert_called_with( - Body=content, - ContentType='text/plain', - ACL=self.storage.default_acl, + obj.upload_fileobj.assert_called_with( + content, + ExtraArgs={ + 'ContentType': 'text/plain', + 'ACL': self.storage.default_acl, + } ) def test_storage_save_gzip(self): @@ -133,14 +135,17 @@ def test_storage_save_gzip(self): content = ContentFile("I should be gzip'd") self.storage.save(name, content) obj = self.storage.bucket.Object.return_value - obj.put.assert_called_with( - Body=mock.ANY, - ContentType='text/css', - ContentEncoding='gzip', - ACL=self.storage.default_acl + obj.upload_fileobj.assert_called_with( + mock.ANY, + ExtraArgs={ + 'ContentType': 'text/css', + 'ContentEncoding': 'gzip', + 'ACL': self.storage.default_acl, + } ) - body = obj.put.call_args[1]['Body'] - zfile = gzip.GzipFile(mode='rb', fileobj=body) + args, kwargs = obj.upload_fileobj.call_args + content = args[0] + zfile = gzip.GzipFile(mode='rb', fileobj=content) self.assertEquals(zfile.read(), b"I should be gzip'd") def test_compress_content_len(self):