Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 7827)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -766,9 +766,12 @@
     def get_db_prep_save(self, value):
         "Returns field's value prepared for saving into a database."
         # Need to convert UploadedFile objects provided via a form to unicode for database insertion
-        if value is None:
+        if hasattr(value, 'file_name'):
+            return value.file_name
+        elif value is None:
             return None
-        return unicode(value)
+        else:
+            return unicode(value)
 
     def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
         field_list = Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel, follow)
@@ -857,9 +860,9 @@
         return os.path.normpath(f)
 
     def save_form_data(self, instance, data):
-        from django.newforms.fields import UploadedFile
+        from django.core.files.uploadedfile import UploadedFile
         if data and isinstance(data, UploadedFile):
-            getattr(instance, "save_%s_file" % self.name)(data.filename, data.data, save=False)
+            getattr(instance, "save_%s_file" % self.name)(data.file_name, data, save=False)
 
     def formfield(self, **kwargs):
         defaults = {'form_class': forms.FileField}
Index: django/core/files/uploadedfile.py
===================================================================
--- django/core/files/uploadedfile.py	(revision 7827)
+++ django/core/files/uploadedfile.py	(working copy)
@@ -3,6 +3,7 @@
 """
 
 import os
+import warnings
 try:
     from cStringIO import StringIO
 except ImportError:
@@ -21,32 +22,60 @@
     DEFAULT_CHUNK_SIZE = 64 * 2**10
 
     def __init__(self, file_name=None, content_type=None, file_size=None, charset=None):
-        self.file_name = file_name
+        self.name = file_name
         self.file_size = file_size
         self.content_type = content_type
         self.charset = charset
 
     def __repr__(self):
-        return "<%s: %s (%s)>" % (self.__class__.__name__, self.file_name, self.content_type)
+        return "<%s: %s (%s)>" % (self.__class__.__name__, self.name, self.content_type)
 
-    def _set_file_name(self, name):
+    def _set_name(self, name):
         # Sanitize the file name so that it can't be dangerous.
         if name is not None:
             # Just use the basename of the file -- anything else is dangerous.
             name = os.path.basename(name)
-            
+
             # File names longer than 255 characters can cause problems on older OSes.
             if len(name) > 255:
                 name, ext = os.path.splitext(name)
                 name = name[:255 - len(ext)] + ext
-                
-        self._file_name = name
-        
+
+        self._name = name
+
+    def _get_name(self):
+        return self._name
+
+    name = property(_get_name, _set_name)
+
     def _get_file_name(self):
-        return self._file_name
-        
-    file_name = property(_get_file_name, _set_file_name)
+        warnings.warn(
+            message = "To access the filename, please use the .name attribute.",
+            category = DeprecationWarning,
+            stacklevel = 1,
+        )
+        return self.name
 
+    def _set_file_name(self, name):
+        warnings.warn(
+            message = "To access the filename, please use the .name attribute.",
+            category = DeprecationWarning,
+            stacklevel = 1,
+        )
+        self.name = name
+
+    file_name = filename = property(_get_file_name, _set_file_name)
+
+    def _get_data(self):
+        warnings.warn(
+            message = "To access the data, please use the .read() or .chunk() UploadedFile interface.",
+            category = DeprecationWarning,
+            stacklevel = 1,
+            )
+        return self.read()
+
+    data = property(_get_data)
+
     def chunk(self, chunk_size=None):
         """
         Read the file and yield chucks of ``chunk_size`` bytes (defaults to
@@ -76,7 +105,7 @@
             chunk_size = UploadedFile.DEFAULT_CHUNK_SIZE
         return self.file_size < chunk_size
 
-    # Abstract methods; subclasses *must* default read() and probably should
+    # Abstract methods; subclasses *must* define read() and probably should
     # define open/close.
     def read(self, num_bytes=None):
         raise NotImplementedError()
@@ -96,14 +125,14 @@
             stacklevel = 2
         )
         backwards_translate = {
-            'filename': 'file_name',
+            'filename': 'name',
             'content-type': 'content_type',
             }
 
         if key == 'content':
             return self.read()
         elif key == 'filename':
-            return self.file_name
+            return self.name
         elif key == 'content-type':
             return self.content_type
         else:
@@ -168,7 +197,7 @@
     """
     def __init__(self, name, content, content_type='text/plain'):
         self.file = StringIO(content or '')
-        self.file_name = name
+        self.name = name
         self.field_name = None
         self.file_size = len(content or '')
         self.content_type = content_type
@@ -188,3 +217,8 @@
                    file_dict.get('content-type', 'text/plain'))
 
     from_dict = classmethod(from_dict)
+
+    def read(self):
+        self.file.seek(0)
+        return super(SimpleUploadedFile, self).read()
+        
Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 7827)
+++ django/newforms/fields.py	(working copy)
@@ -27,8 +27,8 @@
 
 from util import ErrorList, ValidationError
 from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateTimeInput
+from django.core.files.uploadedfile import SimpleUploadedFile as UploadedFile
 
-
 __all__ = (
     'Field', 'CharField', 'IntegerField',
     'DEFAULT_DATE_INPUT_FORMATS', 'DateField',
@@ -419,19 +419,7 @@
     # It's OK if Django settings aren't configured.
     URL_VALIDATOR_USER_AGENT = 'Django (http://www.djangoproject.com/)'
 
-class UploadedFile(StrAndUnicode):
-    "A wrapper for files uploaded in a FileField"
-    def __init__(self, filename, data):
-        self.filename = filename
-        self.data = data
 
-    def __unicode__(self):
-        """
-        The unicode representation is the filename, so that the pre-database-insertion
-        logic can use UploadedFile objects
-        """
-        return self.filename
-
 class FileField(Field):
     widget = FileInput
     default_error_messages = {
@@ -460,23 +448,20 @@
                 category = DeprecationWarning,
                 stacklevel = 2
             )
+            data = UploadedFile(data['filename'], data['content'])
 
         try:
             file_name = data.file_name
             file_size = data.file_size
         except AttributeError:
-            try:
-                file_name = data.get('filename')
-                file_size = bool(data['content'])
-            except (AttributeError, KeyError):
-                raise ValidationError(self.error_messages['invalid'])
+            raise ValidationError(self.error_messages['invalid'])
 
         if not file_name:
             raise ValidationError(self.error_messages['invalid'])
         if not file_size:
             raise ValidationError(self.error_messages['empty'])
 
-        return UploadedFile(file_name, data)
+        return data
 
 class ImageField(FileField):
     default_error_messages = {
Index: tests/modeltests/model_forms/models.py
===================================================================
--- tests/modeltests/model_forms/models.py	(revision 7827)
+++ tests/modeltests/model_forms/models.py	(working copy)
@@ -803,7 +803,7 @@
 >>> f.is_valid()
 True
 >>> type(f.cleaned_data['file'])
-<class 'django.newforms.fields.UploadedFile'>
+<class 'django.core.files.uploadedfile.SimpleUploadedFile'>
 >>> instance = f.save()
 >>> instance.file
 u'...test1.txt'
@@ -814,7 +814,7 @@
 >>> f.is_valid()
 True
 >>> type(f.cleaned_data['file'])
-<class 'django.newforms.fields.UploadedFile'>
+<class 'django.core.files.uploadedfile.SimpleUploadedFile'>
 >>> instance = f.save()
 >>> instance.file
 u'...test1.txt'
@@ -906,7 +906,7 @@
 >>> f.is_valid()
 True
 >>> type(f.cleaned_data['image'])
-<class 'django.newforms.fields.UploadedFile'>
+<class 'django.core.files.uploadedfile.SimpleUploadedFile'>
 >>> instance = f.save()
 >>> instance.image
 u'...test.png'
@@ -918,7 +918,7 @@
 >>> f.is_valid()
 True
 >>> type(f.cleaned_data['image'])
-<class 'django.newforms.fields.UploadedFile'>
+<class 'django.core.files.uploadedfile.SimpleUploadedFile'>
 >>> instance = f.save()
 >>> instance.image
 u'...test.png'
Index: tests/regressiontests/forms/fields.py
===================================================================
--- tests/regressiontests/forms/fields.py	(revision 7827)
+++ tests/regressiontests/forms/fields.py	(working copy)
@@ -800,10 +800,10 @@
 ValidationError: [u'The submitted file is empty.']
 
 >>> type(f.clean(SimpleUploadedFile('name', 'Some File Content')))
-<class 'django.newforms.fields.UploadedFile'>
+<class 'django.core.files.uploadedfile.SimpleUploadedFile'>
 
 >>> type(f.clean(SimpleUploadedFile('name', 'Some File Content'), 'files/test4.pdf'))
-<class 'django.newforms.fields.UploadedFile'>
+<class 'django.core.files.uploadedfile.SimpleUploadedFile'>
 
 # URLField ##################################################################
 
Index: docs/newforms.txt
===================================================================
--- docs/newforms.txt	(revision 7827)
+++ docs/newforms.txt	(working copy)
@@ -1331,23 +1331,12 @@
     * Validates that non-empty file data has been bound to the form.
     * Error message keys: ``required``, ``invalid``, ``missing``, ``empty``
 
-An ``UploadedFile`` object has two attributes:
+To learn more about the ``UploadedFile`` object, see the `file uploads documentation`_.
 
-    ======================  ====================================================
-    Attribute               Description
-    ======================  ====================================================
-    ``filename``            The name of the file, provided by the uploading
-                            client.
-                            
-    ``content``             The array of bytes comprising the file content.
-    ======================  ====================================================
-
-The string representation of an ``UploadedFile`` is the same as the filename
-attribute.
-
 When you use a ``FileField`` on a form, you must also remember to
 `bind the file data to the form`_.
 
+.. _file uploads documentation: ../upload_handling/
 .. _`bind the file data to the form`: `Binding uploaded files to a form`_
 
 ``FilePathField``
