2014-12-22 28 views
2

我是Flask的新手。我想創建一個非常基本的網站,允許上傳圖片。我找到了手冊,但是我想讓它略有不同。這裏是我的代碼:AttributeError:'FileField'對象沒有'File'屬性

###main.py 

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 
     form.presentation.File.save(os.path.join('C:\Users\user\Desktop\New', filename)) 
    return redirect(url_for('/')) 

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



if __name__ == '__main__': 
    app.run(debug=True) 

### forms.py 

from flask.ext.wtf 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}} 
    </form> 

上執行我得到一個錯誤:AttributeError的:「FileField或」對象有我搜索了整整一天沒有屬性「文件」 ,但我無法找到答案的什麼是錯的。

回答

2

根據wtforms doc FileField不具有文件屬性是正確的。

這裏是DOC例如:

class UploadForm(Form): 
    image  = FileField(u'Image File', [validators.regexp(u'^[^/\\]\.jpg$')]) 
    description = TextAreaField(u'Image Description') 

    def validate_image(form, field): 
     if field.data: 
      field.data = re.sub(r'[^a-z0-9_.-]', '_', field.data) 

def upload(request): 
    form = UploadForm(request.POST) 
    if form.image.data: 
     image_data = request.FILES[form.image.name].read() 
     open(os.path.join(UPLOAD_PATH, form.image.data), 'w').write(image_data) 

正如你所看到的文件是從request.FILE不是從FileField讀取。 FileField只有屬性namedata

+0

[Post](https://flask-wtf.readthedocs.org/en/latest/form.html?highlight=data)顯示它從FileField讀取:filename = secure_filename(form.photo.data.filename) form.photo.data.save('uploads /'+ filename) –