Flask 是一个轻量级的 Web 框架,提供了简洁的 API 和易于使用的工具,使得开发 Web 应用程序变得更加简单。
在本文中,我们将深入探讨 Flask 中的文件上传功能。
首先,在 Flask 中使用文件上传,需要用到 werkzeug 模块的 FileStorage 类。FileStorage 可以将上传的文件转换为特定类型的表示,以便在应用程序中进行处理。
接着,我们需要一个 HTML 表单来允许用户选择文件并将其上传到服务器。
HTML 表单的结构如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>文件上传</title>
</head>
<body>
<h1>上传文件</h1>
<form action="file_upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<br><br>
<input type="submit" value="上传">
</form>
</body>
</html>
在 form 标签中,我们设定了 action 属性为 file_upload,表明在提交表单时会将数据发送到 /file_upload 路由上进行处理。method 属性为 post,表示使用 POST 方法发送请求。enctype 属性为 multipart/form-data,是指表单中包含二进制数据(如上传的文件),需要使用该属性来指明表单数据的 MIME 类型。
在 input 标签中,type 属性为 file,表示允许用户选择文件进行上传。name 属性为 file,用于后端处理时的参数名。
现在,我们可以开始处理文件上传逻辑。在 Flask 中,我们需要使用 request.files.get() 方法来获取上传的文件。该方法将返回一个 FileStorage 对象,可以使用它的 save() 方法将文件保存到服务器上。
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('file_upload.html')
@app.route('/file_upload', methods=['POST'])
def file_upload():
file = request.files.get('file')
if file:
file.save('uploads/' + file.filename)
return '文件上传成功'
else:
return '上传失败,未选择文件'
if __name__ == '__main__':
app.run()
在上面的代码中,我们使用了 index() 函数来渲染 HTML 表单。在文件上传时,接收到 POST 请求后将跳转到 file_upload() 函数进行处理。在 file_upload() 函数中,我们首先使用 request.files.get() 方法获取上传的文件,然后通过 save() 方法将文件保存到指定的文件夹中。
注意,这里的文件路径必须使用相对路径,因为 Flask 默认会将当前目录作为应用程序的根目录。
完整代码如下:
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('file_upload.html')
@app.route('/file_upload', methods=['POST'])
def file_upload():
file = request.files.get('file')
if file:
file.save('uploads/' + file.filename)
return '文件上传成功'
else:
return '上传失败,未选择文件'
if __name__ == '__main__':
app.run()
需要注意的是,上传的文件可能会带来安全风险。例如,可能会上传恶意文件或文件名包含恶意代码。因此,我们应该对上传的文件进行检查和处理,以确保安全性。
为了检查上传的文件类型,可以使用 FileStorage 类的 content_type 属性。要限制文件类型,请使用 allowed_extensions 列表。
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
@app.route('/file_upload', methods=['POST'])
def file_upload():
file = request.files.get('file')
if file and allowed_file(file.filename):
file.save('uploads/' + file.filename)
return '文件上传成功'
else:
return '上传失败,文件类型不支持'
在上面的代码中,我们定义了 ALLOWED_EXTENSIONS 列表存储支持的文件类型扩展名。然后,我们定义了 allowed_file() 函数来检查上传的文件是否合法。该函数会检查文件名是否包含支持的扩展名。
如果文件类型合法,则将其保存到指定的文件夹中;否则,返回“文件类型不支持”的提示信息。
以上就是 Flask 文件上传的完整攻略。通过使用 request.files.get() 和 FileStorage 类的 save() 方法,可以轻松地实现文件上传功能。在后端处理上传的文件时,为了确保安全性,应该对文件类型进行检查和处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask 文件上传方法(详解版) - Python技术站