diff --git a/django/core/files/uploadedfile.py b/django/core/files/uploadedfile.py index c498561c18..5e81e968cd 100644 --- a/django/core/files/uploadedfile.py +++ b/django/core/files/uploadedfile.py @@ -202,11 +202,21 @@ class TemporaryUploadedFile(UploadedFile): def read(self, *args): return self._file.read(*args) def seek(self, offset): return self._file.seek(offset) def write(self, s): return self._file.write(s) - def close(self): return self._file.close() def __iter__(self): return iter(self._file) def readlines(self, size=None): return self._file.readlines(size) def xreadlines(self): return self._file.xreadlines() - + def close(self): + try: + return self._file.close() + except OSError, e: + if e.errno == 2: + # Means the file was moved or deleted before the tempfile could unlink it. + # Still sets self._file.close_called and calls self._file.file.close() + # before the exception + return + else: + raise e + class InMemoryUploadedFile(UploadedFile): """ A file uploaded into memory (i.e. stream-to-memory). diff --git a/django/db/models/base.py b/django/db/models/base.py index 7d7def3bad..6b7d4bc32c 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -529,8 +529,8 @@ class Model(object): full_filename = self._get_FIELD_filename(field) if hasattr(raw_field, 'temporary_file_path'): # This file has a file path that we can move. - raw_field.close() file_move_safe(raw_field.temporary_file_path(), full_filename) + raw_field.close() else: # This is a normal uploadedfile that we can stream. fp = open(full_filename, 'wb')