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

yizhihongxing

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的expression使用简介

    CSS expression 是一种在 CSS 中嵌入 JavaScript 代码的特殊方式,在某些场景下可以实现一些有用的效果。本文将为您介绍如何使用 CSS expression。 什么是 CSS expression CSS expression 使用类似于下面的语法结构: property: expression; 其中,property 表示要应用…

    css 2023年6月10日
    00
  • 纯CSS制作自适应分页条附源码下载

    让我详细讲解一下“纯CSS制作自适应分页条附源码下载”的完整攻略,过程中还会包含两个示例说明。 1. 确定分页条的HTML结构 首先,我们要确定分页条的HTML结构。通常来说,分页条包含以下几个部分: “上一页”按钮 “下一页”按钮 数字页码 “省略号”(表示中间省略的页码) 最左边和最右边的页码 一般来说,分页条的HTML结构可以通过无序列表(<ul…

    css 2023年6月10日
    00
  • CSS单标签实现复杂的棋盘布局

    CSS单标签实现复杂的棋盘布局,可以使用:before和:after伪元素来实现。 关键CSS样式如下: /* 容器样式 */ .container { display: flex; flex-wrap: wrap; width: 540px; height: 540px; margin: 0 auto; } /* 单格样式 */ .container:af…

    css 2023年6月10日
    00
  • table-cell完成左侧定宽,右侧定宽及左右定宽等布局的实现方法

    使用table-cell布局是一种简单而强大的网页布局技术,可以实现左侧定宽、右侧定宽以及左右都定宽的布局。以下是实现这些布局的步骤: 左侧定宽,右侧自适应布局 可以通过将左右两个区块设置为表格单元格,并使用CSS的width属性和display属性对区块进行设置。 HTML结构: <div class="container"&gt…

    css 2023年6月10日
    00
  • Vue实现电商网站商品放大镜效果示例

    下面来详细讲解“Vue实现电商网站商品放大镜效果示例”的完整攻略,包括示例说明。 步骤一:搭建项目环境 首先需要安装Vue的开发环境,可以通过如下代码进行安装: npm install -g @vue/cli 安装好后,新建一个基于Vue的项目: vue create my-project 进入项目,安装依赖: cd my-project npm insta…

    css 2023年6月10日
    00
  • 龙腾世纪审判DLC入侵者新装备与技能介绍

    龙腾世纪审判DLC入侵者新装备与技能介绍攻略 简介 本攻略将向玩家介绍龙腾世纪审判DLC入侵者新增的装备和技能,以帮助我们在游戏中更好地战斗和生存。 新装备介绍 1. 恶魔猎手头饰 恶魔猎手头饰是一项新装备,能够增加恶魔猎人的战斗能力。玩家可以在游戏的商店中购买或通过特定任务获得。这个头饰拥有以下属性: 属性:防御力+50 技能:恶魔猎杀 描述:对恶魔的攻击…

    Flask 2023年5月16日
    00
  • CSS滚动条设置方法(横向滚动条、纵向滚动条)

    CSS滚动条是指在网页中的内容过大以至于无法展示在一个视窗中,需要通过滚动条来实现内容的滚动。滚动条在美化上可以让内容更加美观,并增强用户体验。本篇攻略将详细讲解CSS滚动条的美化方法。 首先,我们需要知道CSS滚动条的基本样式属性: scrollbar-width (滚动条的宽度) scrollbar-track-color (滚动条的轨道颜色) scro…

    Web开发基础 2023年3月20日
    00
  • HTML中的表单Form实现居中效果

    下面就来详细讲解一下HTML中的表单Form实现居中效果的完整攻略。 1. 使用CSS实现表单居中 表单元素默认是不会居中的,但是我们可以借助CSS来实现表单的居中效果。具体步骤如下: 创建一个包含表单的容器元素,并设置容器元素的宽度以及 margin 属性来实现居中效果。 <div class="form-container"&g…

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