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

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

相关文章

  • css实现流程导航效果(三种方法)

    针对“css实现流程导航效果(三种方法)”这个主题,我给你详细讲解一下具体的实现步骤和示例方法: 1. 纯CSS实现 实现步骤: 使用<ul>标签创建流程导航菜单; 使用CSS设置菜单样式和布局; 添加CSS伪类:before,在每个<li>标签之前添加步骤流程的序号; 利用:nth-child()选择器来设置每个菜单项不同的颜色,高…

    css 2023年6月10日
    00
  • docker-compose统一管理多个容器使用详解

    Docker-Compose 统一管理多个容器使用详解 Docker-Compose 是 Docker 官方提供的管理多个容器的工具。通过一个配置文件可以管理、启动和停止多个容器,非常方便。 本文将详细讲解 Docker-Compose 的使用方法和相关配置。同时,提供两个实例演示来说明如何使用 Docker-Compose。 Docker-Compose …

    Flask 2023年5月16日
    00
  • css中转换为行内样式的解决方案(css-inline)

    下面是详细讲解 “css中转换为行内样式的解决方案(css-inline)” 的攻略: 什么是 “css中转换为行内样式的解决方案 (css-inline)”? 在开发网站或发送邮件等场合,我们需要将css文件中的样式转换为行内样式,这可以帮助我们避免引用外部样式表,从而达到控制网站或邮件结构和样式的目的。 “css中转换为行内样式的解决方案 (css-in…

    css 2023年6月9日
    00
  • 匹配form表单中所有内容的正则表达式

    匹配form表单中所有内容的正则表达式通常用于对表单数据的验证或提取。以下是一些该正则表达式的攻略: 正则表达式 <form.+?>([\s\S]*?)<\/form> 详细解释 该正则表达式包含了两个部分: <form.+?>: 匹配<form>标签的起始部分,并匹配任意数量的包含在<>中的字符,…

    css 2023年6月10日
    00
  • Vue中使用create-keyframe-animation与动画钩子完成复杂动画

    下面是对于“Vue中使用create-keyframe-animation与动画钩子完成复杂动画”的完整攻略。 一、什么是create-keyframe-animation? create-keyframe-animation 是一个针对动画的库,可以很方便地用于 Vue 项目中。通过使用 create-keyframe-animation,我们可以快速创建…

    css 2023年6月10日
    00
  • 分享一下如何更专业的使用Chrome开发者工具

    当我们需要进行网页调试,或对网站性能进行优化时,Chrome开发者工具是非常有用的利器。以下是如何更专业地使用Chrome开发者工具的攻略: 1. 使用命令行快速调用DevTools Chrome提供了命令行参数来方便开发人员使用DevTools控制台进行调试。可以通过以下命令来打开Chrome浏览器的DevTools控制台: Windows 系统:chro…

    css 2023年6月10日
    00
  • CSS实现元素居中原理解析

    CSS实现元素居中有多种方法,下面将逐一介绍以及加以分析。 1. 相对定位 + 负偏移 在HTML中,我们可以为需要居中的元素设置相对定位(position: relative;), 然后通过负偏移(top: -50%; left: -50%;)将元素移动到其外层容器的正中心。 .container { position: relative; } .cent…

    css 2023年6月10日
    00
  • 纯css实现元素下出现横线动画(background-image)

    下面就为你详细讲解“纯css实现元素下出现横线动画(background-image)”的完整攻略。 前言 在网站开发中,动画效果可以提供更好的用户体验,而 CSS 动画提供了一种无需 JavaScript 即可轻松实现的动画效果。其中,通过 background-image 属性实现元素下出现横线动画是一种常见的动画效果。 具体步骤 实现元素下出现横线动画…

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