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的伪元素以及动画效果来实现。下面是实现波浪效果的具体步骤: 步骤一:HTML结构准备 首先,我们需要准备HTML结构,用于展示波浪效果。 <div class="wave"></div> 步骤二:CSS样式设置 接下来,我们需要设置CSS样式,具体实现方式如下: 设置背景颜色 首先…

    css 2023年6月9日
    00
  • 详解CSS中视窗单位和百分比单位的使用

    详解CSS中视窗单位和百分比单位的使用 在CSS中,有很多种单位可以用来定义元素的尺寸和位置,其中视窗单位和百分比单位是比较常用的单位。这篇攻略将会介绍这两种单位的具体使用方法。 视窗单位 视窗单位是指相对于浏览器可视窗口大小的单位,包括vw、vh、vmin和vmax四种单位。这些单位可以帮助我们实现响应式设计,使得网页布局能够自适应不同的屏幕尺寸。 vw和…

    css 2023年6月9日
    00
  • JavaScript+css+HTML实现移动端轮播图(含源码)

    下面是对“JavaScript+css+HTML实现移动端轮播图”完整攻略的详细讲解。 思路 移动端轮播图的实现,主要涉及到以下几个方面: HTML结构:轮播图需要一个容器,并在容器内部放置轮播的内容。 CSS样式:定义轮播图的尺寸、样式和布局。 JavaScript逻辑:实现轮播图的自动播放及手动切换等交互效果。 HTML结构 我们需要定义以下HTML结构…

    css 2023年6月10日
    00
  • 分析uniapp入门之nvue爬坑记

    “分析uniapp入门之nvue爬坑记”是一篇介绍如何使用uniapp的nvue模板的文章。文章中详细阐述了nvue模板的基本语法,以及在实际使用过程中可能遇到的一些问题以及解决方法。 以下是该攻略的完整内容: 一、nvue模板介绍 nvue是uniapp框架自带的渲染模板,在使用时需要在.vue文件的template标签中指定type=”nvue”。 nv…

    css 2023年6月9日
    00
  • 对于一些css样式的巧妙方法进行总结(推荐)

    对于一些 CSS 样式的巧妙方法进行总结 在开发 Web 页面时,CSS 样式的使用是非常重要的,可以用来美化页面的同时也可以提高页面的交互性和用户体验。在这里,介绍一些 CSS 样式的巧妙方法,这些方法不仅可以方便我们的开发,还可以提高开发效率,降低代码量。 示例1:使用 Flexbox 进行页面布局 Flexbox 是一个 CSS 布局模块,提供了更加灵…

    css 2023年6月10日
    00
  • Flask 的重定向和错误处理

    Flask 是一个轻量级的 Web 框架,它提供了重定向和错误处理的方法,使得 Web 应用程序的开发变得更为方便和流畅。 本篇文章将详细介绍 Flask 中的重定向和错误处理方法,并提供代码示例。 重定向 重定向是指将用户从一个 URL 地址自动转向到另一个 URL 地址的过程。在 Flask 中,可以使用 redirect() 方法实现重定向功能。具体方…

    Flask 2023年3月13日
    00
  • 移动端前端适配方案(总结)

    移动端前端适配方案(总结) 1. 为什么需要移动端适配? 在PC端开发中,我们通常使用px做为长度单位进行开发,因为PC端屏幕大小不会随着设备变化而变化,因此使用固定的像素单位长度并不会影响网站的显示效果。然而在移动端,因为移动设备的屏幕尺寸各异,因此使用固定像素的方式进行设计和开发,可能会导致在不同设备上出现内容偏大或偏小,影响用户体验。 因此,为了在移动…

    css 2023年6月10日
    00
  • vue实现设置载入动画和初始化页面动画效果

    下面我详细讲解“vue实现设置载入动画和初始化页面动画效果”的完整攻略。 1. 载入动画实现 1.1 基本思路 在Vue中,可以使用Vue的生命周期函数和异步组件的方式实现载入动画。 在开始加载数据时,可以在data中定义一个loading变量,初始值为true。当数据加载完成后,修改loading值为false,并在页面中根据loading状态显示动画效果…

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