From 5c954136eaef3d98d532368deec4c19cf892f664 Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Thu, 5 Apr 2012 15:44:04 +0000 Subject: Fixed #15644 -- Improved Django File wrapper to support more file-like objects. Thanks nickname123 and Michael Palumbo for working on the patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17871 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/files/base.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'django') diff --git a/django/core/files/base.py b/django/core/files/base.py index 48d0be43f0..29dbb6fcc1 100644 --- a/django/core/files/base.py +++ b/django/core/files/base.py @@ -36,8 +36,13 @@ class File(FileProxyMixin): if not hasattr(self, '_size'): if hasattr(self.file, 'size'): self._size = self.file.size - elif os.path.exists(self.file.name): + elif hasattr(self.file, 'name') and os.path.exists(self.file.name): self._size = os.path.getsize(self.file.name) + elif hasattr(self.file, 'tell') and hasattr(self.file, 'seek'): + pos = self.file.tell() + self.file.seek(0, os.SEEK_END) + self._size = self.file.tell() + self.file.seek(pos) else: raise AttributeError("Unable to determine the file's size.") return self._size @@ -61,12 +66,12 @@ class File(FileProxyMixin): if hasattr(self, 'seek'): self.seek(0) - # Assume the pointer is at zero... - counter = self.size - while counter > 0: - yield self.read(chunk_size) - counter -= chunk_size + while True: + data = self.read(chunk_size) + if not data: + break + yield data def multiple_chunks(self, chunk_size=None): """ -- cgit v1.3