Flask 文件上传方法(详解版)

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技术站

(2)
上一篇 2023年3月13日
下一篇 2023年3月13日

相关文章

  • CSS教程:网页英文字体和中文字体应用

    CSS教程:网页英文字体和中文字体应用 在网页设计中,文字的排版和展示是非常重要的。通过 CSS,我们可以实现对网页中文字体的设置和样式的调整。在这篇教程中,我们将会介绍如何应用英文字体和中文字体。 英文字体应用 在 CSS 中,可以通过 font-family 属性来设置英文字体。在设置英文字体时,需要注意以下几点: 选择一个合适的英文字体。 如果该字体不…

    css 2023年6月9日
    00
  • Flask中基于Token的身份认证的实现

    下面是Flask中基于Token的身份认证的实现完整攻略: 一、什么是基于Token的身份认证 基于Token的身份认证,通常是指在Web应用程序中通过Token来验证用户身份的一种方式。这种方式相比传统的Session认证方式,具有以下优势: 无状态:Token身份验证不需要在服务端维护session,因此可以实现无状态的验证。 可扩展:由于每个请求都携带…

    Flask 2023年5月16日
    00
  • Bootstrap栅格系统的使用详解

    下面我来为您介绍一篇关于Bootstrap栅格系统使用的详细攻略。 1. 什么是Bootstrap栅格系统 Bootstrap 栅格系统是一个响应式、移动设备优先的流式格系统,它用于页面布局,具有以下特性: 支持多种设备(如手机、平板、桌面电脑); 网格布局(12个网格列,通过媒体查询实现不同的排版); 预定义好了多种布局类型(如:嵌套、等宽、偏移、反向布局…

    css 2023年6月10日
    00
  • 浏览器特定的CSS Hacks汇总

    浏览器特定的CSS Hacks是指通过CSS的特殊语法规则,在不同的浏览器中实现相同的样式效果。这种做法在某些特定情况下可以解决浏览器兼容性问题,但是需要谨慎使用,并且应该尽量避免使用。因为它可能会导致代码难以维护和升级,并且可能会引发其他和兼容性无关的问题。 下面我将详细讲解浏览器特定的CSS Hacks的完整攻略: 发现兼容性问题 首先,我们需要发现哪些…

    css 2023年6月10日
    00
  • IE 5.x/Win 和模型bug

    IE 5.x/Win 和模型bug是指在IE 5.x/Win浏览器下,使用盒模型布局时,由于浏览器对盒模型的处理方式不一致,导致布局出现偏差的问题。这个问题在现代浏览器中已经得到了解决,但是在一些需要支持旧版IE浏览器的项目中,仍需要考虑这个问题的解决方案。 解决IE 5.x/Win和模型bug问题的方法是使用特殊的CSS属性来操纵IE5盒模型的行为。下面是…

    css 2023年6月10日
    00
  • Flask sqlalchemy一对多与多对一与一对一及多对多关系介绍

    下面给您详细讲解“Flask sqlalchemy一对多与多对一与一对一及多对多关系介绍”的完整攻略。 一对多关系 一对多关系适用于一个模型拥有多个其他模型的实例,但是其他模型的实例只属于一个模型实例。比如一个用户可以拥有多篇文章,但是一篇文章只属于一个用户。 在 Flask sqlalchemy 中可以使用 relationship 属性来建立一对多关系,…

    Flask 2023年5月15日
    00
  • CSS3盒子模型详解

    下面是关于“CSS3盒子模型详解”的完整攻略。 什么是CSS3盒子模型 CSS3盒子模型是Web开发中的一种基本布局模型,它是指用于布局的文档树中的任何元素都可以看作是一个矩形的盒子,这个盒子包含了元素的内容、内边距、边框和外边距。 CSS3盒子模型的属性 CSS3盒子模型的属性包括: width(宽度) 宽度指定了盒子的内容区域的宽度,不包含内边距、边框和…

    css 2023年6月10日
    00
  • 设置span宽度高度的方法

    设置span元素的宽度和高度可以使用width和height属性来完成。下面是详细的攻略: 1. 使用CSS样式设置宽高 在CSS样式中,可以直接设置span元素的宽高,方法如下: span { width: 100px; height: 50px; } 这样,span元素的宽度为100px,高度为50px。 2. 让span元素变成块级元素 可以将span…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部