找回密码
 立即注册
首页 python Python-Web 查看内容
文件上传涉及的地方的确比普通表单提交涉及的问题比较多
今天就在这里分享下表单验证文件上传的问题!
前端js上传步骤点击:怎么用js上传图片及文件


需要导入的模块:
from wtforms import Form
from flask_wtf.file import FileField, FileRequired, FileAllowed
import time
import string
import random
import hashlib
import os
from flask import Blueprint, render_template, request, g, session, url_for, redirect
from werkzeug.utils import secure_filename

主函数代码如下:
@bp.route('/upload/', methods=['POST'])
@login_validator
def upload():
    if request.method == 'POST':
        form = UploadForm(request.files) #把文件传送给表单验证
        if form.validate(): #验证是否成功
            data = form.file.data #获取验证成功的数据.
            filename = secure_filename(data.filename) #验证文件名是否安全,注意此方法会中文过滤掉!
            random_filename = random_filename(filename)  #生成随机文件名
            path = os.path.join(config.UPLOAD_IMAGE_PATH, random_filename) #在congfig文件配置的保存路径进行拼接
            data.save(path) #关键保存数据
            image_url = url_for('common.get_image', filename=random_filename) #获取到url_for()反转连接返回给前端
            return restful.success(data={'img_url':image_url}) #自己定义的restful.根据自己的要求返回即可
        else:
            return restful.param_error(form.get_error) #把验证错误的返回给前端

#此函数是随机文件名,有其他的方法的可以忽略
def random_filename(rawfilename):
    letters = string.ascii_letters
    random_name = str(time.time()) + ''.join(random.sample(letters, 5))
    filename = hashlib.md5(random_name.encode('utf-8')).hexdigest()
    subffix = os.path.splitext(rawfilename)[-1]
    return filename + subffix

#此函数是访问文件方法
@bp.route('/image/<filename>')
def get_image(filename):
    return send_from_directory(config.UPLOAD_IMAGE_PATH, filename,as_attachment=True) #as_attachment=True 是否支持文件下载

接下来是表单验证
from wtforms import Form
class BaseForm(Form): #定义的错误访问
    def get_error(self):
        return self.errors.popitem()[1][0]

class UploadForm(BaseForm): 定义的对象继承上面的对象
    file = FileField(validators=[FileRequired(message='文件不能为空'), FileAllowed(['jpg','png','gif','bmp','zip'], message='文件类型错误')])


分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册