Skip to content

Commit

Permalink
Merge branch 'fix/support-reopening-of-files'
Browse files Browse the repository at this point in the history
  • Loading branch information
theriverman committed Mar 24, 2024
2 parents a0c49d5 + 4e44b32 commit 187ac14
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions django_minio_backend/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,19 @@ def iso_date_prefix(_, file_name_ext: str) -> str:
return f"{get_iso_date()}/{file_name_ext}"


class S3File(File):
"""A file returned from the Minio server"""

def __init__(self, file, name, storage):
super().__init__(file, name)
self._storage = storage

def open(self, mode=None, *args, **kwargs):
if self.closed:
self.file = self._storage.open(self.name, mode or "rb").file
return super().open(mode, *args, **kwargs)


@deconstructible
class MinioBackend(Storage):
"""
Expand Down Expand Up @@ -176,7 +189,7 @@ def get_available_name(self, name, max_length=None):
return name
return super(MinioBackend, self).get_available_name(name, max_length)

def _open(self, object_name, mode='rb', **kwargs) -> File:
def _open(self, object_name, mode='rb', **kwargs) -> S3File:
"""
Implements the Storage._open(name,mode='rb') method
:param name (str): object_name [path to file excluding bucket name which is implied]
Expand All @@ -187,8 +200,8 @@ def _open(self, object_name, mode='rb', **kwargs) -> File:
if mode != 'rb':
raise ValueError('Files retrieved from MinIO are read-only. Use save() method to override contents')
try:
resp = self.client.get_object(self.bucket, object_name, kwargs)
file = File(file=io.BytesIO(resp.read()), name=object_name)
resp = self.client.get_object(self.bucket, object_name, **kwargs)
file = S3File(file=io.BytesIO(resp.read()), name=object_name, storage=self)
finally:
resp.close()
resp.release_conn()
Expand Down

0 comments on commit 187ac14

Please sign in to comment.