Merge pull request #2868 from matrix-org/erikj/refactor_media_storage

Make store_file use store_into_file
This commit is contained in:
Erik Johnston 2018-02-20 11:31:24 +00:00 committed by GitHub
commit 324c3e9399
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -58,23 +58,13 @@ class MediaStorage(object):
Returns:
Deferred[str]: the file path written to in the primary media store
"""
path = self._file_info_to_path(file_info)
fname = os.path.join(self.local_media_directory, path)
dirname = os.path.dirname(fname)
if not os.path.exists(dirname):
os.makedirs(dirname)
# Write to the main repository
yield make_deferred_yieldable(threads.deferToThread(
_write_file_synchronously, source, fname,
))
# Tell the storage providers about the new file. They'll decide
# if they should upload it and whether to do so synchronously
# or not.
for provider in self.storage_providers:
yield provider.store_file(path, file_info)
with self.store_into_file(file_info) as (f, fname, finish_cb):
# Write to the main repository
yield make_deferred_yieldable(threads.deferToThread(
_write_file_synchronously, source, f,
))
yield finish_cb()
defer.returnValue(fname)
@ -240,21 +230,16 @@ class MediaStorage(object):
)
def _write_file_synchronously(source, fname):
"""Write `source` to the path `fname` synchronously. Should be called
def _write_file_synchronously(source, dest):
"""Write `source` to the file like `dest` synchronously. Should be called
from a thread.
Args:
source: A file like object to be written
fname (str): Path to write to
source: A file like object that's to be written
dest: A file like object to be written to
"""
dirname = os.path.dirname(fname)
if not os.path.exists(dirname):
os.makedirs(dirname)
source.seek(0) # Ensure we read from the start of the file
with open(fname, "wb") as f:
shutil.copyfileobj(source, f)
shutil.copyfileobj(source, dest)
class FileResponder(Responder):