1
0
mirror of https://github.com/django/django.git synced 2025-06-04 02:59:13 +00:00

Fixed #26644 -- Allowed wrapping NamedTemporaryFile with File.

914c72be2abb1c6dd860cb9279beaa66409ae1b2 introduced a regression that
causes saving a NamedTemporaryFile in a FileField to raise a
SuspiciousFileOperation. To remedy this, if a File has an absolute
path as a filename, use only the basename as the filename.
This commit is contained in:
Hugo Osvaldo Barrera 2016-05-27 14:54:26 -03:00 committed by Tim Graham
parent fa654da613
commit 1b407050dd
3 changed files with 18 additions and 0 deletions

View File

@ -18,6 +18,10 @@ class File(FileProxyMixin):
self.file = file self.file = file
if name is None: if name is None:
name = getattr(file, 'name', None) name = getattr(file, 'name', None)
# Use only the basename from a file's name if it's an absolute path,
# e.g. from NamedTemporaryFile.
if isinstance(name, six.string_types) and os.path.isabs(name):
name = os.path.basename(name)
self.name = name self.name = name
if hasattr(file, 'mode'): if hasattr(file, 'mode'):
self.mode = file.mode self.mode = file.mode

View File

@ -10,6 +10,7 @@ import threading
import time import time
import unittest import unittest
from datetime import datetime, timedelta from datetime import datetime, timedelta
from tempfile import NamedTemporaryFile
from django.core.cache import cache from django.core.cache import cache
from django.core.exceptions import SuspiciousFileOperation, SuspiciousOperation from django.core.exceptions import SuspiciousFileOperation, SuspiciousOperation
@ -869,6 +870,13 @@ class FileFieldStorageTests(TestCase):
with temp_storage.open('tests/stringio') as f: with temp_storage.open('tests/stringio') as f:
self.assertEqual(f.read(), b'content') self.assertEqual(f.read(), b'content')
def test_save_temporary_file(self):
storage = Storage()
with NamedTemporaryFile() as f:
f.write(b'content')
storage.normal = File(f)
storage.save() # no crash
# Tests for a race condition on file saving (#4948). # Tests for a race condition on file saving (#4948).
# This is written in such a way that it'll always pass on platforms # This is written in such a way that it'll always pass on platforms

View File

@ -26,6 +26,12 @@ else:
class FileTests(unittest.TestCase): class FileTests(unittest.TestCase):
def test_file_truncates_namedtemporaryfile_name(self):
named_file = NamedTemporaryFile()
f = File(named_file)
self.assertEqual(f.name, os.path.basename(named_file.name))
def test_unicode_uploadedfile_name(self): def test_unicode_uploadedfile_name(self):
uf = UploadedFile(name='¿Cómo?', content_type='text') uf = UploadedFile(name='¿Cómo?', content_type='text')
self.assertIs(type(repr(uf)), str) self.assertIs(type(repr(uf)), str)