From dfca8e64f81e101ff4381556b3618bd9cb957d77 Mon Sep 17 00:00:00 2001 From: Romain Clement Date: Wed, 11 Apr 2018 15:38:30 +0200 Subject: [PATCH 1/4] Add explicit "content_type" when writing with GridFS backend --- flask_fs/backends/gridfs.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/flask_fs/backends/gridfs.py b/flask_fs/backends/gridfs.py index 14e24bd..be88830 100644 --- a/flask_fs/backends/gridfs.py +++ b/flask_fs/backends/gridfs.py @@ -54,7 +54,11 @@ def read(self, filename): return f.read() def write(self, filename, content): - return self.fs.put(self.as_binary(content), filename=filename) + return self.fs.put( + self.as_binary(content), + filename=filename, + content_type=content.content_type + ) def delete(self, filename): regex = '^{0}'.format(re.escape(filename)) From c553999c0afea890c2720c7f18246f0b142b6c49 Mon Sep 17 00:00:00 2001 From: Romain Clement Date: Wed, 11 Apr 2018 16:37:14 +0200 Subject: [PATCH 2/4] Make sure the file to write with GridFS has a "content_type" attribute --- flask_fs/backends/gridfs.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/flask_fs/backends/gridfs.py b/flask_fs/backends/gridfs.py index be88830..f3879c3 100644 --- a/flask_fs/backends/gridfs.py +++ b/flask_fs/backends/gridfs.py @@ -54,10 +54,16 @@ def read(self, filename): return f.read() def write(self, filename, content): + kwargs = { + 'filename': filename + } + + if hasattr(content, 'content_type'): + kwargs['content_type'] = content.content_type + return self.fs.put( self.as_binary(content), - filename=filename, - content_type=content.content_type + **kwargs ) def delete(self, filename): From 61c98a7eed9433be0674c4db2d0dd6f5a2ea8028 Mon Sep 17 00:00:00 2001 From: Romain Clement Date: Wed, 11 Apr 2018 22:38:19 +0200 Subject: [PATCH 3/4] Add tests for writing PNG/JPEG image files (with proper MIME-types) in GridFS backend --- flask_fs/backends/gridfs.py | 5 +---- tests/conftest.py | 8 ++++++-- tests/test_gridfs_backend.py | 37 ++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/flask_fs/backends/gridfs.py b/flask_fs/backends/gridfs.py index f3879c3..724f3d8 100644 --- a/flask_fs/backends/gridfs.py +++ b/flask_fs/backends/gridfs.py @@ -61,10 +61,7 @@ def write(self, filename, content): if hasattr(content, 'content_type'): kwargs['content_type'] = content.content_type - return self.fs.put( - self.as_binary(content), - **kwargs - ) + return self.fs.put(self.as_binary(content), **kwargs) def delete(self, filename): regex = '^{0}'.format(re.escape(filename)) diff --git a/tests/conftest.py b/tests/conftest.py index 74b31c3..d268521 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -52,8 +52,12 @@ def jpgfile(): class Utils(object): - def filestorage(self, filename, content): - return FileStorage(self.file(content), filename) + def filestorage(self, filename, content, content_type=None): + return FileStorage( + self.file(content), + filename, + content_type=content_type + ) def file(self, content): if isinstance(content, six.binary_type): diff --git a/tests/test_gridfs_backend.py b/tests/test_gridfs_backend.py index 3e8758e..041bad5 100644 --- a/tests/test_gridfs_backend.py +++ b/tests/test_gridfs_backend.py @@ -10,6 +10,9 @@ from flask_fs.storage import Config import pytest +import mimetypes +import six + TEST_DB = 'fstest' @@ -17,6 +20,16 @@ class GridFsBackendTest(BackendTestCase): hasher = 'md5' + @pytest.fixture + def pngimage(self, pngfile): + with open(pngfile, 'rb') as f: + yield f + + @pytest.fixture + def jpgimage(self, jpgfile): + with open(jpgfile, 'rb') as f: + yield f + @pytest.fixture(autouse=True) def setup(self): self.client = MongoClient() @@ -58,3 +71,27 @@ def test_delete_with_versions(self, faker): self.backend.delete(filename) assert not self.file_exists(filename) + + def test_write_pngimage(self, pngimage, utils): + filename = 'test.png' + content = six.binary_type(pngimage.read()) + content_type = mimetypes.guess_type(filename)[0] + f = utils.filestorage(filename, content, content_type) + self.backend.write(filename, f) + + with self.backend.open(filename, 'rb') as f: + assert f.content_type == content_type + + self.assert_bin_equal(filename, content) + + def test_write_jpgimage(self, jpgimage, utils): + filename = 'test.jpg' + content = six.binary_type(jpgimage.read()) + content_type = mimetypes.guess_type(filename)[0] + f = utils.filestorage(filename, content, content_type) + self.backend.write(filename, f) + + with self.backend.open(filename, 'rb') as f: + assert f.content_type == content_type + + self.assert_bin_equal(filename, content) From 7b58ff681151bd0132aeca75b3b3d77067a6d9fa Mon Sep 17 00:00:00 2001 From: Romain Clement Date: Wed, 18 Apr 2018 23:43:45 +0200 Subject: [PATCH 4/4] Check that content_type is not None when using it in GridFS backend --- flask_fs/backends/gridfs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_fs/backends/gridfs.py b/flask_fs/backends/gridfs.py index 724f3d8..ce69239 100644 --- a/flask_fs/backends/gridfs.py +++ b/flask_fs/backends/gridfs.py @@ -58,7 +58,7 @@ def write(self, filename, content): 'filename': filename } - if hasattr(content, 'content_type'): + if hasattr(content, 'content_type') and content.content_type is not None: kwargs['content_type'] = content.content_type return self.fs.put(self.as_binary(content), **kwargs)