无法在flaskapp上传文件/图像

时间:2016-07-30 18:09:47

标签: python flask flask-wtforms flask-appbuilder

我在html / php中创建了一个表单,并使用flask作为后端。

一切都很完美,除非我尝试上传图片时我总是看到错误:

error is**"UnboundLocalError: local variable 'filename' referenced before assignment"**

我的flaskapp代码段是

@app.route('/apple', methods=['GET', 'POST'])
def apple():
  onlineAppForm = RegForm()
  if request.method == 'POST':
    try:
        file = request.files['file']
        if file and allowed_file(file.filename):
           filename = secure_filename(file.filename)
           file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
    except Exception as e:
        print "Form without file "+str(e)
    return render_template("apply2.html", data=data, filename=filename, form=onlineAppForm)

这是我的上传文件夹

UPLOAD_FOLDER = 'static/uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.secret_key = os.urandom(24)

我没有得到错误的地方。

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

这是我的表格

<tr>
    <td class="sectionheading">Upload Scanned Copies</td>
</tr>
<tr>
    <td height="12">&nbsp;</td>
</tr>
<tr id="photosignthumb_span" height="40">
    <td align="left" valign="middle" width="100%">&nbsp;<b>
        <span class="mandatory">*</span>
        Please upload scanned copies of your photo </b>
        <input type="file" name="photo" id="photofile"  
         method="post"/><br>
        Please upload your recent passport size photograph:max 
        80KB(Only JPEG and JPG formats)
    </td>
</tr>
<tr id="photosignthumb_span" height="40">
    <td align="left" valign="middle" width="100%">&nbsp;<b>
        <span class="mandatory">*</span>
        Please upload scanned copies of your signature </b> 
        <input type="file" name="sign" id="signfile" 
        method="post"/><br>
        Please upload your recent passport size photograph:max 
        80KB(Only JPEG and JPG formats)
    </td>
</tr>

1 个答案:

答案 0 :(得分:0)

filename的存在取决于几个条件:

1 - file = request.files['file']
2 - if file and allowed_file(file.filename):
3 - 不引发异常

所以,如果上述任何一种情况都没有发生,那么filename就不会成为现实,而是你的错误信息。

编辑:

flask docs引用文件上传:

  
      
  1. 标记用enctype = multipart / form-data标记,a放在该表单中。
  2.   
  3. 应用程序从请求对象上的文件字典中访问该文件。
  4.   
  5. 使用文件的save()方法将文件永久保存在文件系统的某个位置。
  6.   

查看您提供的表单,似乎您没有任何form块,您应该有类似的内容:

<form action="/apple" method="post" enctype="multipart/form-data">
<tr>
    <td class="sectionheading">Upload Scanned Copies</td>
</tr>
<tr>
    <td height="12">&nbsp;</td>
</tr>
<tr id="photosignthumb_span" height="40">
    <td align="left" valign="middle" width="100%">&nbsp;<b>
        <span class="mandatory">*</span>
        Please upload scanned copies of your photo </b>
        <input type="file" name="photo" id="photofile"  
         method="post"/><br>
        Please upload your recent passport size photograph:max 
        80KB(Only JPEG and JPG formats)
    </td>
</tr>
<tr id="photosignthumb_span" height="40">
    <td align="left" valign="middle" width="100%">&nbsp;<b>
        <span class="mandatory">*</span>
        Please upload scanned copies of your signature </b> 
        <input type="file" name="sign" id="signfile" 
        method="post"/><br>
        Please upload your recent passport size photograph:max 
        80KB(Only JPEG and JPG formats)
    </td>
</tr>
</form>