#18899 FileSystemStorage.save should support any file-like objects
This commit is contained in:
parent
7ec2a21be1
commit
664855b74e
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue