JavaEar 专注于收集分享传播有价值的技术资料

AttributeError: 'FileField' object has no attribute 'File'

I'm new to Flask. I wanted to create a very basic site which allows to upload the images.I found the manual, however I wanted to make it slightly different. Here's my code:

import os
from forms import UploadForm
from flask import Flask,render_template, url_for, redirect, send_from_directory
from werkzeug import secure_filename

ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

app = Flask(__name__)
app.config['SECRET_KEY'] = 'string'

@app.route('/', methods=('GET', 'POST'))
def upload():
    form = UploadForm()
    if form.validate_on_submit() and allowed_file(form.presentation.File.filename):
        filename = secure_filename(form.presentation.file.filename)

        print filename'C:\Users\user\Desktop\New', filename))
    return redirect(url_for('/'))

    filename = None
    return render_template('upload.html', form=form, filename=filename)

if __name__ == '__main__':


from import Form
from wtforms import FileField, validators, ValidationError, SubmitField
from wtforms.validators import InputRequired

class UploadForm(Form):
  presentation = FileField('Upload Image here', validators=[InputRequired()])
  submit = SubmitField("Send")

### upload.html
   {% for message in form.presentation.errors %}
     <div class="flash">{{ message }}</div>
   {% endfor %}
   <form action="/" method="POST" enctype="multipart/form-data">
     {{ form.presentation.label }}
     {{ form.presentation }}
     {{ form.csrf_token }}
     {{ form.submit}}

On executing I get an error: AttributeError: 'FileField' object has no attribute 'File' I've searched the whole day, but I cannot find the answer what's wrong.


  1. According to the wtforms doc FileField does not have File attribute that's right.

    Here is the doc example:

    class UploadForm(Form):
        image        = FileField(u'Image File', [validators.regexp(u'^[^/\\]\.jpg$')])
        description  = TextAreaField(u'Image Description')
        def validate_image(form, field):
       = re.sub(r'[^a-z0-9_.-]', '_',
    def upload(request):
        form = UploadForm(request.POST)
            image_data = request.FILES[].read()
            open(os.path.join(UPLOAD_PATH,, 'w').write(image_data)

    As you can see the file is read from request.FILE not from the FileField. The FileField only has the attributes name and data.