diff --git a/HISTORY.rst b/HISTORY.rst index 879556a5d9..d462579126 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -205,6 +205,7 @@ * Enable list link icons. * Add outline links CSS for facets. * Add a bottom margin to list links. +* Use copyfileobj to save documents to files 3.1.11 (2019-04-XX) =================== diff --git a/docs/releases/3.2.rst b/docs/releases/3.2.rst index 36334f2f5d..8314a1b9e8 100644 --- a/docs/releases/3.2.rst +++ b/docs/releases/3.2.rst @@ -237,6 +237,7 @@ Other changes * Enable list link icons. * Add outline links CSS for facets. * Add a bottom margin to list links. +* Use copyfileobj to save documents to files Removals -------- diff --git a/mayan/apps/documents/models/document_version_models.py b/mayan/apps/documents/models/document_version_models.py index aea9fcd1cb..ca632acbf8 100644 --- a/mayan/apps/documents/models/document_version_models.py +++ b/mayan/apps/documents/models/document_version_models.py @@ -3,6 +3,7 @@ from __future__ import absolute_import, unicode_literals import hashlib import logging import os +import shutil import uuid from django.apps import apps @@ -310,23 +311,13 @@ class DocumentVersion(models.Model): sender=Document, instance=self.document ) - def save_to_file(self, filepath, buffer_size=1024 * 1024): + def save_to_file(self, file_object): """ Save a copy of the document from the document storage backend to the local filesystem """ - input_descriptor = self.open() - output_descriptor = open(filepath, 'wb') - while True: - copy_buffer = input_descriptor.read(buffer_size) - if copy_buffer: - output_descriptor.write(copy_buffer) - else: - break - - output_descriptor.close() - input_descriptor.close() - return filepath + input_file_object = self.open() + shutil.copyfileobj(fsrc=input_file_object, fdst=file_object) @property def size(self): diff --git a/mayan/apps/file_metadata/drivers/exiftool.py b/mayan/apps/file_metadata/drivers/exiftool.py index ca4295099b..0703185155 100644 --- a/mayan/apps/file_metadata/drivers/exiftool.py +++ b/mayan/apps/file_metadata/drivers/exiftool.py @@ -13,7 +13,7 @@ except ImportError: from django.utils.translation import ugettext_lazy as _ -from mayan.apps.storage.utils import fs_cleanup, mkstemp +from mayan.apps.storage.utils import NamedTemporaryFile from ..literals import DEFAULT_EXIF_PATH from ..classes import FileMetadataDriver @@ -44,15 +44,15 @@ class EXIFToolDriver(FileMetadataDriver): def _process(self, document_version): if self.command_exiftool: - new_file_object, temp_filename = mkstemp() + temporary_fileobject = NamedTemporaryFile() try: - document_version.save_to_file(filepath=temp_filename) - result = self.command_exiftool(temp_filename) + document_version.save_to_file(file_object=temporary_fileobject) + result = self.command_exiftool(temporary_fileobject.name) return json.loads(s=result.stdout)[0] finally: - fs_cleanup(filename=temp_filename) + temporary_fileobject.close() else: logger.warning( 'EXIFTool binary not found, not processing document '