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: Returns:
Deferred[str]: the file path written to in the primary media store 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) with self.store_into_file(file_info) as (f, fname, finish_cb):
if not os.path.exists(dirname): # Write to the main repository
os.makedirs(dirname) yield make_deferred_yieldable(threads.deferToThread(
_write_file_synchronously, source, f,
# Write to the main repository ))
yield make_deferred_yieldable(threads.deferToThread( yield finish_cb()
_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)
defer.returnValue(fname) defer.returnValue(fname)
@ -240,21 +230,16 @@ class MediaStorage(object):
) )
def _write_file_synchronously(source, fname): def _write_file_synchronously(source, dest):
"""Write `source` to the path `fname` synchronously. Should be called """Write `source` to the file like `dest` synchronously. Should be called
from a thread. from a thread.
Args: Args:
source: A file like object to be written source: A file like object that's to be written
fname (str): Path to write to 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 source.seek(0) # Ensure we read from the start of the file
with open(fname, "wb") as f: shutil.copyfileobj(source, dest)
shutil.copyfileobj(source, f)
class FileResponder(Responder): class FileResponder(Responder):