mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-12-18 14:16:45 +00:00
Fixes "I/O Operation on Closed File error"
https://github.com/matthewwithanm/django-imagekit/issues/391#issuecomment-766708283
This commit is contained in:
parent
843127efa8
commit
14c606301c
1 changed files with 32 additions and 0 deletions
|
@ -1,4 +1,6 @@
|
||||||
"""Handles backends for storages"""
|
"""Handles backends for storages"""
|
||||||
|
import os
|
||||||
|
from tempfile import SpooledTemporaryFile
|
||||||
from storages.backends.s3boto3 import S3Boto3Storage
|
from storages.backends.s3boto3 import S3Boto3Storage
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,3 +17,33 @@ class ImagesStorage(S3Boto3Storage): # pylint: disable=abstract-method
|
||||||
location = "images"
|
location = "images"
|
||||||
default_acl = "public-read"
|
default_acl = "public-read"
|
||||||
file_overwrite = False
|
file_overwrite = False
|
||||||
|
|
||||||
|
"""
|
||||||
|
This is our custom version of S3Boto3Storage that fixes a bug in
|
||||||
|
boto3 where the passed in file is closed upon upload.
|
||||||
|
From:
|
||||||
|
https://github.com/matthewwithanm/django-imagekit/issues/391#issuecomment-275367006
|
||||||
|
https://github.com/boto/boto3/issues/929
|
||||||
|
https://github.com/matthewwithanm/django-imagekit/issues/391
|
||||||
|
"""
|
||||||
|
|
||||||
|
def _save(self, name, content):
|
||||||
|
"""
|
||||||
|
We create a clone of the content file as when this is passed to
|
||||||
|
boto3 it wrongly closes the file upon upload where as the storage
|
||||||
|
backend expects it to still be open
|
||||||
|
"""
|
||||||
|
# Seek our content back to the start
|
||||||
|
content.seek(0, os.SEEK_SET)
|
||||||
|
|
||||||
|
# Create a temporary file that will write to disk after a specified
|
||||||
|
# size. This file will be automatically deleted when closed by
|
||||||
|
# boto3 or after exiting the `with` statement if the boto3 is fixed
|
||||||
|
with SpooledTemporaryFile() as content_autoclose:
|
||||||
|
|
||||||
|
# Write our original content into our copy that will be closed by boto3
|
||||||
|
content_autoclose.write(content.read())
|
||||||
|
|
||||||
|
# Upload the object which will auto close the
|
||||||
|
# content_autoclose instance
|
||||||
|
return super(ImagesStorage, self)._save(name, content_autoclose)
|
Loading…
Reference in a new issue