Loading django/core/files/storage.py +9 −2 Original line number Diff line number Diff line Loading @@ -195,10 +195,17 @@ class FileSystemStorage(Storage): fd = os.open(full_path, os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr(os, 'O_BINARY', 0)) try: locks.lock(fd, locks.LOCK_EX) _file = None for chunk in content.chunks(): os.write(fd, chunk) if _file is None: mode = 'wb' if isinstance(chunk, bytes) else 'wt' _file = os.fdopen(fd, mode) _file.write(chunk) finally: locks.unlock(fd) if _file is not None: _file.close() else: os.close(fd) except OSError as e: if e.errno == errno.EEXIST: Loading tests/regressiontests/file_storage/tests.py +11 −0 Original line number Diff line number Diff line Loading @@ -356,6 +356,17 @@ class FileStorageTests(unittest.TestCase): finally: os.remove = real_remove def test_file_chunks_error(self): """ Test behaviour when file.chunks() is raising an error """ f1 = ContentFile('chunks fails') def failing_chunks(): raise IOError f1.chunks = failing_chunks with self.assertRaises(IOError): self.storage.save('error.file', f1) class CustomStorage(FileSystemStorage): def get_available_name(self, name): Loading Loading
django/core/files/storage.py +9 −2 Original line number Diff line number Diff line Loading @@ -195,10 +195,17 @@ class FileSystemStorage(Storage): fd = os.open(full_path, os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr(os, 'O_BINARY', 0)) try: locks.lock(fd, locks.LOCK_EX) _file = None for chunk in content.chunks(): os.write(fd, chunk) if _file is None: mode = 'wb' if isinstance(chunk, bytes) else 'wt' _file = os.fdopen(fd, mode) _file.write(chunk) finally: locks.unlock(fd) if _file is not None: _file.close() else: os.close(fd) except OSError as e: if e.errno == errno.EEXIST: Loading
tests/regressiontests/file_storage/tests.py +11 −0 Original line number Diff line number Diff line Loading @@ -356,6 +356,17 @@ class FileStorageTests(unittest.TestCase): finally: os.remove = real_remove def test_file_chunks_error(self): """ Test behaviour when file.chunks() is raising an error """ f1 = ContentFile('chunks fails') def failing_chunks(): raise IOError f1.chunks = failing_chunks with self.assertRaises(IOError): self.storage.save('error.file', f1) class CustomStorage(FileSystemStorage): def get_available_name(self, name): Loading