diff options
| author | Benjamin Kagia <kagia@server.fake> | 2013-04-19 20:20:23 +0300 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2013-07-11 09:11:59 -0400 |
| commit | b0953dc91385fb2823294a76d3c99e01c7b7e4ee (patch) | |
| tree | 86f129ff99ca6f8276e71eb7f811fc28596badc3 /django | |
| parent | ecd746191c428866e621b9d13ac90a116b1369dc (diff) | |
Fixed #13721 -- Added UploadedFile.content_type_extra.
Thanks Waldemar Kornewald and mvschaik for work on the patch.
Diffstat (limited to 'django')
| -rw-r--r-- | django/core/files/uploadedfile.py | 13 | ||||
| -rw-r--r-- | django/core/files/uploadhandler.py | 9 | ||||
| -rw-r--r-- | django/http/multipartparser.py | 12 | ||||
| -rw-r--r-- | django/test/client.py | 6 |
4 files changed, 23 insertions, 17 deletions
diff --git a/django/core/files/uploadedfile.py b/django/core/files/uploadedfile.py index 39b99ff78f..9f948ca03b 100644 --- a/django/core/files/uploadedfile.py +++ b/django/core/files/uploadedfile.py @@ -23,11 +23,12 @@ class UploadedFile(File): """ DEFAULT_CHUNK_SIZE = 64 * 2**10 - def __init__(self, file=None, name=None, content_type=None, size=None, charset=None): + def __init__(self, file=None, name=None, content_type=None, size=None, charset=None, content_type_extra=None): super(UploadedFile, self).__init__(file, name) self.size = size self.content_type = content_type self.charset = charset + self.content_type_extra = content_type_extra def __repr__(self): return force_str("<%s: %s (%s)>" % ( @@ -55,13 +56,13 @@ class TemporaryUploadedFile(UploadedFile): """ A file uploaded to a temporary location (i.e. stream-to-disk). """ - def __init__(self, name, content_type, size, charset): + def __init__(self, name, content_type, size, charset, content_type_extra): if settings.FILE_UPLOAD_TEMP_DIR: file = tempfile.NamedTemporaryFile(suffix='.upload', dir=settings.FILE_UPLOAD_TEMP_DIR) else: file = tempfile.NamedTemporaryFile(suffix='.upload') - super(TemporaryUploadedFile, self).__init__(file, name, content_type, size, charset) + super(TemporaryUploadedFile, self).__init__(file, name, content_type, size, charset, content_type_extra) def temporary_file_path(self): """ @@ -83,8 +84,8 @@ class InMemoryUploadedFile(UploadedFile): """ A file uploaded into memory (i.e. stream-to-memory). """ - def __init__(self, file, field_name, name, content_type, size, charset): - super(InMemoryUploadedFile, self).__init__(file, name, content_type, size, charset) + def __init__(self, file, field_name, name, content_type, size, charset, content_type_extra): + super(InMemoryUploadedFile, self).__init__(file, name, content_type, size, charset, content_type_extra) self.field_name = field_name def open(self, mode=None): @@ -109,7 +110,7 @@ class SimpleUploadedFile(InMemoryUploadedFile): def __init__(self, name, content, content_type='text/plain'): content = content or b'' super(SimpleUploadedFile, self).__init__(BytesIO(content), None, name, - content_type, len(content), None) + content_type, len(content), None, None) def from_dict(cls, file_dict): """ diff --git a/django/core/files/uploadhandler.py b/django/core/files/uploadhandler.py index f5e95cf2fd..6739b26e0c 100644 --- a/django/core/files/uploadhandler.py +++ b/django/core/files/uploadhandler.py @@ -64,6 +64,7 @@ class FileUploadHandler(object): self.content_type = None self.content_length = None self.charset = None + self.content_type_extra = None self.request = request def handle_raw_input(self, input_data, META, content_length, boundary, encoding=None): @@ -84,7 +85,7 @@ class FileUploadHandler(object): """ pass - def new_file(self, field_name, file_name, content_type, content_length, charset=None): + def new_file(self, field_name, file_name, content_type, content_length, charset=None, content_type_extra=None): """ Signal that a new file has been started. @@ -96,6 +97,7 @@ class FileUploadHandler(object): self.content_type = content_type self.content_length = content_length self.charset = charset + self.content_type_extra = content_type_extra def receive_data_chunk(self, raw_data, start): """ @@ -132,7 +134,7 @@ class TemporaryFileUploadHandler(FileUploadHandler): Create the file object to append to as data is coming in. """ super(TemporaryFileUploadHandler, self).new_file(file_name, *args, **kwargs) - self.file = TemporaryUploadedFile(self.file_name, self.content_type, 0, self.charset) + self.file = TemporaryUploadedFile(self.file_name, self.content_type, 0, self.charset, self.content_type_extra) def receive_data_chunk(self, raw_data, start): self.file.write(raw_data) @@ -187,7 +189,8 @@ class MemoryFileUploadHandler(FileUploadHandler): name = self.file_name, content_type = self.content_type, size = file_size, - charset = self.charset + charset = self.charset, + content_type_extra = self.content_type_extra ) diff --git a/django/http/multipartparser.py b/django/http/multipartparser.py index eeb435fa57..9a5193e49b 100644 --- a/django/http/multipartparser.py +++ b/django/http/multipartparser.py @@ -50,7 +50,7 @@ class MultiPartParser(object): The raw post data, as a file-like object. :upload_handlers: A list of UploadHandler instances that perform operations on the uploaded - data. + data. :encoding: The encoding with which to treat the incoming data. """ @@ -177,11 +177,9 @@ class MultiPartParser(object): file_name = force_text(file_name, encoding, errors='replace') file_name = self.IE_sanitize(unescape_entities(file_name)) - content_type = meta_data.get('content-type', ('',))[0].strip() - try: - charset = meta_data.get('content-type', (0, {}))[1].get('charset', None) - except: - charset = None + content_type, content_type_extra = meta_data.get('content-type', ('', {})) + content_type = content_type.strip() + charset = content_type_extra.get('charset') try: content_length = int(meta_data.get('content-length')[0]) @@ -194,7 +192,7 @@ class MultiPartParser(object): try: handler.new_file(field_name, file_name, content_type, content_length, - charset) + charset, content_type_extra) except StopFutureHandlers: break diff --git a/django/test/client.py b/django/test/client.py index 94cfada725..8dbd33ccf1 100644 --- a/django/test/client.py +++ b/django/test/client.py @@ -180,7 +180,11 @@ def encode_multipart(boundary, data): def encode_file(boundary, key, file): to_bytes = lambda s: force_bytes(s, settings.DEFAULT_CHARSET) - content_type = mimetypes.guess_type(file.name)[0] + if hasattr(file, 'content_type'): + content_type = file.content_type + else: + content_type = mimetypes.guess_type(file.name)[0] + if content_type is None: content_type = 'application/octet-stream' return [ |
