diff --git a/django/core/files/uploadhandler.py b/django/core/files/uploadhandler.py
index f5e95cf..7f8fcf6 100644
--- a/django/core/files/uploadhandler.py
+++ b/django/core/files/uploadhandler.py
@@ -84,7 +84,8 @@ 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,9 @@ class FileUploadHandler(object):
         self.content_type = content_type
         self.content_length = content_length
         self.charset = charset
+        if content_type_extra is None:
+            content_type_extra = {}
+        self.content_type_extra = content_type_extra
 
     def receive_data_chunk(self, raw_data, start):
         """
diff --git a/django/http/multipartparser.py b/django/http/multipartparser.py
index 070874f..2199c8e 100644
--- a/django/http/multipartparser.py
+++ b/django/http/multipartparser.py
@@ -176,8 +176,11 @@ class MultiPartParser(object):
                     file_name = self.IE_sanitize(unescape_entities(file_name))
 
                     content_type = meta_data.get('content-type', ('',))[0].strip()
+                    content_type_extra = meta_data.get('content-type', (0, {}))[1]
+                    if content_type_extra is None:
+                        content_type_extra = {}
                     try:
-                        charset = meta_data.get('content-type', (0, {}))[1].get('charset', None)
+                        charset = content_type_extra.get('charset', None)
                     except:
                         charset = None
 
@@ -192,7 +195,7 @@ class MultiPartParser(object):
                             try:
                                 handler.new_file(field_name, file_name,
                                                  content_type, content_length,
-                                                 charset)
+                                                 charset, content_type_extra.copy())
                             except StopFutureHandlers:
                                 break
 
diff --git a/django/test/client.py b/django/test/client.py
index 2506437..f432abc 100644
--- a/django/test/client.py
+++ b/django/test/client.py
@@ -178,7 +178,10 @@ 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 [
diff --git a/docs/topics/http/file-uploads.txt b/docs/topics/http/file-uploads.txt
index 80bd5f3..142031c 100644
--- a/docs/topics/http/file-uploads.txt
+++ b/docs/topics/http/file-uploads.txt
@@ -243,6 +243,11 @@ In addition to those inherited from :class:`~django.core.files.File`, all
     For :mimetype:`text/*` content-types, the character set (i.e. ``utf8``)
     supplied by the browser. Again, "trust but verify" is the best policy here.
 
+.. attribute:: UploadedFile.content_type_extra
+
+    A dict containing the extra parameters that were passed to the
+    content-type header.
+
 .. attribute:: UploadedFile.temporary_file_path()
 
     Only files uploaded onto disk will have this method; it returns the full
@@ -402,7 +407,7 @@ attributes:
 
     The default is 64*2\ :sup:`10` bytes, or 64 KB.
 
-``FileUploadHandler.new_file(self, field_name, file_name, content_type, content_length, charset)``
+``FileUploadHandler.new_file(self, field_name, file_name, content_type, content_length, charset, content_type_extra)``
     Callback signaling that a new file upload is starting. This is called
     before any data has been fed to any upload handlers.
 
@@ -419,6 +424,9 @@ attributes:
     ``charset`` is the character set (i.e. ``utf8``) given by the browser.
     Like ``content_length``, this sometimes won't be provided.
 
+    ``content_type_extra`` is a dict containing the extra parameters that
+    were passed to the content-type header.
+
     This method may raise a ``StopFutureHandlers`` exception to prevent
     future handlers from handling this file.
 
diff --git a/tests/regressiontests/file_uploads/tests.py b/tests/regressiontests/file_uploads/tests.py
index 45e7342..2f5f363 100644
--- a/tests/regressiontests/file_uploads/tests.py
+++ b/tests/regressiontests/file_uploads/tests.py
@@ -249,6 +249,16 @@ class FileUploadTests(TestCase):
         got = json.loads(response.content.decode('utf-8'))
         self.assertTrue('f' not in got)
 
+    def test_extra_content_type(self):
+        f = tempfile.NamedTemporaryFile()
+        f.write('a' * (2 ** 21))
+        f.seek(0)
+        f.content_type = 'text/plain; blob-key=upload blob key; other=test'
+
+        response = self.client.post("/file_uploads/content_type_extra/", {'f': f})
+        got = json.loads(response.content)
+        self.assertEqual(got['f'], 'upload blob key')
+
     def test_broken_custom_upload_handler(self):
         f = tempfile.NamedTemporaryFile()
         f.write(b'a' * (2 ** 21))
diff --git a/tests/regressiontests/file_uploads/uploadhandler.py b/tests/regressiontests/file_uploads/uploadhandler.py
index b30ef13..a079aff 100644
--- a/tests/regressiontests/file_uploads/uploadhandler.py
+++ b/tests/regressiontests/file_uploads/uploadhandler.py
@@ -2,7 +2,10 @@
 Upload handlers to test the upload API.
 """
 
-from django.core.files.uploadhandler import FileUploadHandler, StopUpload
+from django.core.files.uploadedfile import InMemoryUploadedFile
+from django.core.files.uploadhandler import (FileUploadHandler, StopUpload,
+                                             StopFutureHandlers)
+from StringIO import StringIO
 
 
 class QuotaUploadHandler(FileUploadHandler):
@@ -33,3 +36,38 @@ class ErroringUploadHandler(FileUploadHandler):
     """A handler that raises an exception."""
     def receive_data_chunk(self, raw_data, start):
         raise CustomUploadError("Oops!")
+
+class ContentTypeExtraUploadHandler(FileUploadHandler):
+    """
+    File upload handler that handles content_type_extra
+    """
+
+    def new_file(self, *args, **kwargs):
+        super(ContentTypeExtraUploadHandler, self).new_file(*args, **kwargs)
+        self.blobkey = self.content_type_extra.get('blob-key', '')
+        self.file = StringIO()
+        self.file.write(self.blobkey)
+        self.active = self.blobkey is not None
+        if self.active:
+            raise StopFutureHandlers()
+
+    def receive_data_chunk(self, raw_data, start):
+        """
+        Add the data to the StringIO file.
+        """
+        if not self.active:
+            return raw_data
+
+    def file_complete(self, file_size):
+        if not self.active:
+            return
+
+        self.file.seek(0)
+        return InMemoryUploadedFile(
+            file = self.file,
+            field_name = self.field_name,
+            name = self.file_name,
+            content_type = self.content_type,
+            size = file_size,
+            charset = self.charset
+        )
diff --git a/tests/regressiontests/file_uploads/urls.py b/tests/regressiontests/file_uploads/urls.py
index fc55768..405c727 100644
--- a/tests/regressiontests/file_uploads/urls.py
+++ b/tests/regressiontests/file_uploads/urls.py
@@ -6,14 +6,15 @@ from . import views
 
 
 urlpatterns = patterns('',
-    (r'^upload/$',          views.file_upload_view),
-    (r'^verify/$',          views.file_upload_view_verify),
-    (r'^unicode_name/$',    views.file_upload_unicode_name),
-    (r'^echo/$',            views.file_upload_echo),
-    (r'^echo_content/$',    views.file_upload_echo_content),
-    (r'^quota/$',           views.file_upload_quota),
-    (r'^quota/broken/$',    views.file_upload_quota_broken),
-    (r'^getlist_count/$',   views.file_upload_getlist_count),
-    (r'^upload_errors/$',   views.file_upload_errors),
-    (r'^filename_case/$',   views.file_upload_filename_case_view),
+    (r'^upload/$',              views.file_upload_view),
+    (r'^verify/$',              views.file_upload_view_verify),
+    (r'^unicode_name/$',        views.file_upload_unicode_name),
+    (r'^echo/$',                views.file_upload_echo),
+    (r'^echo_content/$',        views.file_upload_echo_content),
+    (r'^quota/$',               views.file_upload_quota),
+    (r'^quota/broken/$',        views.file_upload_quota_broken),
+    (r'^getlist_count/$',       views.file_upload_getlist_count),
+    (r'^upload_errors/$',       views.file_upload_errors),
+    (r'^content_type_extra/$',  views.file_upload_content_type_extra),
+    (r'^filename_case/$',       views.file_upload_filename_case_view),
 )
diff --git a/tests/regressiontests/file_uploads/views.py b/tests/regressiontests/file_uploads/views.py
index eb7b654..8275365 100644
--- a/tests/regressiontests/file_uploads/views.py
+++ b/tests/regressiontests/file_uploads/views.py
@@ -11,7 +11,8 @@ from django.utils.encoding import force_bytes
 
 from .models import FileModel
 from .tests import UNICODE_FILENAME, UPLOAD_TO
-from .uploadhandler import QuotaUploadHandler, ErroringUploadHandler
+from .uploadhandler import (QuotaUploadHandler, ErroringUploadHandler,
+                            ContentTypeExtraUploadHandler)
 
 
 def file_upload_view(request):
@@ -124,6 +125,11 @@ def file_upload_getlist_count(request):
         file_counts[key] = len(request.FILES.getlist(key))
     return HttpResponse(json.dumps(file_counts))
 
+def file_upload_content_type_extra(request):
+    request.upload_handlers.insert(0, ContentTypeExtraUploadHandler())
+    r = dict([(k, f.read()) for k, f in request.FILES.items()])
+    return HttpResponse(json.dumps(r))
+
 def file_upload_errors(request):
     request.upload_handlers.insert(0, ErroringUploadHandler())
     return file_upload_echo(request)
