Flask实现文件上传

1,150 阅读2分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

引言:文件上传的功能经常会在项目中被用到,今儿我们就来谈谈Flask中的文件上传功能如何实现。

文件上传的原理

  1. 一个<form>标签标记有enctype=multipart/form-data,并且<input>type=file
  2. 服务端应用通过请求对象的files字典访问文件。
  3. 使用文件save()方法将文件永久的保存在文件系统上的某处。 小提示:multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。

后端逻辑

首先先在Flask对象的配置中定义默认的上传文件夹的路径和上传文件的最大大小。

app.config['UPLOAD_FOLDER']:定义上传文件夹的路径
app.config['MAX_CONTENT_LENGTH']:上传文件的最大大小(以字节为单位。)

设置如下:

app.config['UPLOAD_FOLDER'] = 'static/images'
app.config['MAX_CONTENT_LENGTH'] = 4*1024*1024

设置好了后,接下来就是实现相应的接口,其中我们需要一个访问的页面,页面中需要有两个按钮,一个用于上传文件,一个用于提交。具体获取文件的流程最开始有提到。这边再稍微说明以下:flaskrequestfiles对象(该对象为一个字典)用于保存file文件,可以通过其来获得相应的文件,并将其保存到具体的路径下面,具体代码如下:


comc = Blueprint('commic', __name__)  #蓝图

@comc.route('/upload',methods=['GET','POST'])
def upload():
    if request.method == 'POST':
        img = request.files['file']  #获得文件
        print(request.files)
        try:
            img.save(os.path.join(comc_app.config['UPLOAD_FOLDER'],secure_filename(img.filename)))  # 保存文件到指定路径
        except:
            return render_template('/admin/upload.html',notice='文件上传失败!')
        return render_template('/admin/upload.html',notice='文件上传成功!')
    else:
        return render_template('/admin/upload.html')

前端逻辑

前端页面的话相对于后端页面要简单一些,具体就是前端传文件数据,而每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。这里我简单给一个模板:

image.png

image.png 上传成功: image.png

因为设置了文件最大大小所以如果超过最大大小,页面就会报错:

image.png