summaryrefslogtreecommitdiff
path: root/django/core/files
diff options
context:
space:
mode:
Diffstat (limited to 'django/core/files')
-rw-r--r--django/core/files/temp.py58
-rw-r--r--django/core/files/uploadedfile.py3
-rw-r--r--django/core/files/uploadhandler.py3
3 files changed, 61 insertions, 3 deletions
diff --git a/django/core/files/temp.py b/django/core/files/temp.py
new file mode 100644
index 0000000000..298fcbf0a5
--- /dev/null
+++ b/django/core/files/temp.py
@@ -0,0 +1,58 @@
+"""
+The temp module provides a NamedTemporaryFile that can be re-opened on any
+platform. Most platforms use the standard Python tempfile.TemporaryFile class,
+but MS Windows users are given a custom class.
+
+This is needed because in Windows NT, the default implementation of
+NamedTemporaryFile uses the O_TEMPORARY flag, and thus cannot be reopened [1].
+
+1: http://mail.python.org/pipermail/python-list/2005-December/359474.html
+"""
+
+import os
+import tempfile
+
+__all__ = ('NamedTemporaryFile', 'gettempdir',)
+
+if os.name == 'nt':
+ class TemporaryFile(object):
+ """
+ Temporary file object constructor that works in Windows and supports
+ reopening of the temporary file in windows.
+ """
+ def __init__(self, mode='w+b', bufsize=-1, suffix='', prefix='',
+ dir=None):
+ fd, name = tempfile.mkstemp(suffix=suffix, prefix=prefix,
+ dir=dir)
+ self.name = name
+ self._file = os.fdopen(fd, mode, bufsize)
+
+ def __del__(self):
+ try:
+ self._file.close()
+ except (OSError, IOError):
+ pass
+ try:
+ os.unlink(self.name)
+ except (OSError):
+ pass
+
+ try:
+ super(TemporaryFile, self).__del__()
+ except AttributeError:
+ pass
+
+
+ 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()
+
+ NamedTemporaryFile = TemporaryFile
+else:
+ NamedTemporaryFile = tempfile.NamedTemporaryFile
+
+gettempdir = tempfile.gettempdir
diff --git a/django/core/files/uploadedfile.py b/django/core/files/uploadedfile.py
index 7f515f94d4..c498561c18 100644
--- a/django/core/files/uploadedfile.py
+++ b/django/core/files/uploadedfile.py
@@ -3,7 +3,6 @@ Classes representing uploaded files.
"""
import os
-import tempfile
import warnings
try:
from cStringIO import StringIO
@@ -12,6 +11,8 @@ except ImportError:
from django.conf import settings
+from django.core.files import temp as tempfile
+
__all__ = ('UploadedFile', 'TemporaryUploadedFile', 'InMemoryUploadedFile', 'SimpleUploadedFile')
# Because we fooled around with it a bunch, UploadedFile has a bunch
diff --git a/django/core/files/uploadhandler.py b/django/core/files/uploadhandler.py
index 008a05a148..fa4d2df804 100644
--- a/django/core/files/uploadhandler.py
+++ b/django/core/files/uploadhandler.py
@@ -1,8 +1,7 @@
"""
Base file upload handler classes, and the built-in concrete subclasses
"""
-import os
-import tempfile
+
try:
from cStringIO import StringIO
except ImportError: