mirror of
				https://github.com/django/django.git
				synced 2025-10-30 17:16:10 +00:00 
			
		
		
		
	#18899 FileSystemStorage.save should support any file-like objects
This commit is contained in:
		| @@ -37,13 +37,17 @@ class Storage(object): | |||||||
|  |  | ||||||
|     def save(self, name, content): |     def save(self, name, content): | ||||||
|         """ |         """ | ||||||
|         Saves new content to the file specified by name. The content should be a |         Saves new content to the file specified by name. The content should be | ||||||
|         proper File object, ready to be read from the beginning. |         a proper File object or any python file-like object, ready to be read | ||||||
|  |         from the beginning. | ||||||
|         """ |         """ | ||||||
|         # Get the proper name for the file, as it will actually be saved. |         # Get the proper name for the file, as it will actually be saved. | ||||||
|         if name is None: |         if name is None: | ||||||
|             name = content.name |             name = content.name | ||||||
|  |  | ||||||
|  |         if not hasattr(content, 'chunks'): | ||||||
|  |             content = File(content) | ||||||
|  |  | ||||||
|         name = self.get_available_name(name) |         name = self.get_available_name(name) | ||||||
|         name = self._save(name, content) |         name = self._save(name, content) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ from __future__ import absolute_import | |||||||
|  |  | ||||||
| import gzip | import gzip | ||||||
| import shutil | import shutil | ||||||
|  | import StringIO | ||||||
| import tempfile | import tempfile | ||||||
|  |  | ||||||
| from django.core.cache import cache | from django.core.cache import cache | ||||||
| @@ -102,6 +103,35 @@ class FileStorageTests(TestCase): | |||||||
|         obj4.random.save("random_file", ContentFile("random content")) |         obj4.random.save("random_file", ContentFile("random content")) | ||||||
|         self.assertTrue(obj4.random.name.endswith("/random_file")) |         self.assertTrue(obj4.random.name.endswith("/random_file")) | ||||||
|  |  | ||||||
|  |     def test_file_object(self): | ||||||
|  |         # Create sample file | ||||||
|  |         temp_storage.save('tests/example.txt', ContentFile('some content')) | ||||||
|  |  | ||||||
|  |         # Load it as python file object | ||||||
|  |         file_obj = open(temp_storage.path('tests/example.txt')) | ||||||
|  |  | ||||||
|  |         # Save it using storage and read its content | ||||||
|  |         temp_storage.save('tests/file_obj', file_obj) | ||||||
|  |         self.assertTrue(temp_storage.exists('tests/file_obj')) | ||||||
|  |         self.assertEqual( | ||||||
|  |             temp_storage.open('tests/file_obj').read(), | ||||||
|  |             'some content') | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def test_stringio(self): | ||||||
|  |         # Test passing StringIO instance as content argument to save | ||||||
|  |         output = StringIO.StringIO() | ||||||
|  |         output.write('content') | ||||||
|  |         output.seek(0) | ||||||
|  |  | ||||||
|  |         # Save it and read written file | ||||||
|  |         temp_storage.save('tests/stringio', output) | ||||||
|  |         self.assertTrue(temp_storage.exists('tests/stringio')) | ||||||
|  |         self.assertEqual( | ||||||
|  |             temp_storage.open('tests/stringio').read(), | ||||||
|  |             'content') | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class FileTests(unittest.TestCase): | class FileTests(unittest.TestCase): | ||||||
|     def test_context_manager(self): |     def test_context_manager(self): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user