flask处理文件上传

news2024/9/26 5:21:19

在这里插入图片描述

flask处理文件上传

在Flask框架中,你可以使用request.files对象来处理文件上传。以下是一个简单的文件上传的示例:

from flask import Flask, request
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)

# 定义文件上传的路径
UPLOAD_FOLDER = '/path/to/upload'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        # 检查是否有文件被上传
        if 'file' not in request.files:
            return '没有文件被上传'
        
        file = request.files['file']

        # 如果用户没有选择文件,浏览器可能会提交一个空文件,需要检查一下
        if file.filename == '':
            return '没有选择文件'
        
        # 文件检查通过后,保存文件
        if file:
            # 使用 Werkzeug 的 secure_filename 来确保文件名是安全的
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return '文件已成功上传'
    
    return '''
    <!doctype html>
    <title>Upload new File</title>
    <h1>Upload new File</h1>
    <form method=post enctype=multipart/form-data>
      <input type=file name=file>
      <input type=submit value=Upload>
    </form>
    '''

if __name__ == '__main__':
    app.run(debug=True)

在上述代码中,我们首先从flask和werkzeug.utils导入所需的模块。然后我们创建了一个Flask应用实例,并设置了文件上传路径。然后我们创建了一个路由/upload,这个路由接受GET和POST请求。

处理多个文件上传:

from flask import request
from werkzeug.utils import secure_filename

@app.route('/upload', methods=['POST'])
def upload_files():
    # `request.files` 是一个字典,包含了所有上传的文件
    for file_key in request.files:
        file = request.files[file_key]

        # 使用 `secure_filename` 函数来确保文件名是安全的
        filename = secure_filename(file.filename)

        # 保存文件到服务器
        file.save(os.path.join('uploads', filename))

    return 'Files uploaded successfully'

当我们接收到POST请求时,我们首先检查是否有文件在请求中。如果没有文件,我们就返回错误消息。如果有文件,我们使用Werkzeug的secure_filename函数来确保文件名是安全的,然后我们保存文件。

最后,当我们接收到GET请求时,我们返回一个HTML表单,用户可以通过这个表单来上传文件。

这里需要自己创建并指定文件上传的路径(在代码中为UPLOAD_FOLDER),并确保应用有权限写入此路径。

Werkzeug的secure_filename函数

werkzeug.utils.secure_filename 是一个安全功能,它确保用户上传的文件名不会导致安全问题。

这个函数首先检查并移除文件名中可能导致问题的特殊字符,例如路径分隔符(/\)和空格,从而防止目录遍历攻击(这种攻击通过在文件名中包含路径分隔符来试图访问不应该被访问的文件系统路径)。

例如,如果有人尝试上传一个名为"…/…/…/etc/passwd"的文件,secure_filename函数将会清理文件名,结果可能就变成了"etc_passwd",这样就防止了可能的安全问题。

另外,它还确保文件名仅包含ASCII字符,这样就避免了由于Unicode字符可能导致的一些编码问题。

下面是一个例子:

from werkzeug.utils import secure_filename

filename = secure_filename("../../etc/passwd")
print(filename)  # 输出: etc_passwd

所以,使用secure_filename函数是一个很好的实践,能确保用户上传的文件名不会导致文件系统或安全问题。

html文件上传例子

<!DOCTYPE html>
<html>
<body>

<h2>File Upload</h2>
<form action="http://localhost:5000/upload" method="post" enctype="multipart/form-data">
  Select file to upload:
  <input type="file" name="file" id="file">
  <input type="submit" value="Upload" name="submit">
</form>

</body>
</html>

在这个HTML代码中,我们创建了一个表单,其中包含一个文件输入元素和一个提交按钮。enctype="multipart/form-data"属性是必需的,如果你想要在表单中包含文件上传控件。

action="http://localhost:5000/upload"指定了表单提交后的处理URL。当你点击"Upload"按钮后,文件将被发送到该URL。请将该URL替换为你的Flask应用接受文件上传的实际URL。

在此示例中假设Flask应用正在本地运行,并监听5000端口,且你已经设置了一个名为/upload的路由来处理文件上传。

enctype=“multipart/form-data”

在HTML中,当你创建一个表单用于提交数据到服务器时,需要决定如何将这些数据编码和打包到HTTP请求中。这是由表单的 enctype 属性决定的。

enctype 属性决定了表单数据在提交时如何编码。它有三个可能的值:

  • application/x-www-form-urlencoded:这是默认值,所有的字符都会被编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)。这种编码方式适用于简单的表单,只包含文本字段。
  • multipart/form-data:这种编码方式不会对字符进行编码,这意味着你可以上传二进制文件。这是文件上传时必须使用的编码方式。
  • text/plain:这种编码方式会将空格转换为 “+” 加号,但不对特殊字符编码。这种编码方式不常用。

当你设置 enctype="multipart/form-data" 时,意味着你告诉浏览器应该使用 multipart/form-data 格式来编码表单数据。这个格式每个部分都是一个数据块,这些数据块可以包含二进制数据(例如文件内容),因此可以用来上传文件。每个部分都有自己的头部信息,描述了数据的类型、文件名等信息。这就是为什么你可以在一个表单中同时上传多个文件,每个文件作为请求主体中的一个部分。

当你使用 multipart/form-data 格式提交表单数据时,数据会被划分为多个部分或块。每一部分都代表了表单中的一个字段。例如,如果你的表单有两个文本字段和一个文件字段,那么数据就会被划分为三个部分。

每个部分都有自己的头部信息和主体内容。头部信息描述了这部分数据的类型和其他元数据。例如,头部信息可能包含Content-Disposition字段,该字段描述了这部分数据是一个表单字段,并提供了字段的名称和(如果这是一个文件字段的话)文件名。头部信息还可能包含Content-Type字段,该字段描述了数据的媒体类型(例如,文本、JPEG图片等)。

主体内容是这部分数据的实际内容。对于文本字段,主体内容就是用户输入的文本。对于文件字段,主体内容就是文件的二进制数据。

这是一个multipart/form-data请求的简化示例:

POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data;boundary="boundary"

--boundary
Content-Disposition: form-data; name="text"

hello
--boundary
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain

Hello, World!
--boundary--

在这个示例中,数据被划分为两个部分。第一部分是一个名为"text"的文本字段,内容是"hello"。第二部分是一个名为"file"的文件字段,文件名是"example.txt",内容是"Hello, World!“。每个部分都由一个分界符(”–boundary")和自己的头部信息开始。请求以一个带有两个短划线的分界符(“–boundary–”)结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/809509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二进制的妙用:判别2的幂次方的3把钥匙

本篇博客会讲解力扣“231. 2 的幂”的解题思路&#xff0c;这是题目链接。 这道题有3种巧妙的思路&#xff0c;且听我一一道来。 思路1 如果一个数是2的幂次方&#xff0c;则这个数的二进制中一定有且只有1位是1。比如&#xff0c;1的二进制是1&#xff0c;2的二进制是10&…

Python零基础入门(九)——函数,类和对象

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python入门专栏&#xff1a;《Python入门》欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 码字不易&#xff0c;如果觉得文章不…

Spring 6【方法参数校验、SpingAOP介绍、Schema-based方式实现AOP 】(十四)-全面详解(学习总结---从入门到深化)

目录 4.方法参数校验 SpingAOP介绍 Schema-based方式实现AOP 4.方法参数校验 Spring框架提供了一种校验方法参数的方法&#xff0c;在调用一个方法传入参数后&#xff0c;会判断参数是否满足数据校验。如果满足方法执行&#xff0c;如果不满足&#xff1a;不执行方法&…

Android跨进程传大图思考及实现——附上原理分析

1.抛一个问题 这一天&#xff0c;法海想锻炼小青的定力&#xff0c;由于Bitmap也是一个Parcelable类型的数据&#xff0c;法海想通过Intent给小青传个特别大的图片 intent.putExtra("myBitmap",fhBitmap)如果“法海”(Activity)使用Intent去传递一个大的Bitmap给“…

win10中CUDA cundnn pytorch环境搭建记录

关于在win10中安装cuda cudnn及pytorch全家桶(torch torchvision torchaudio)的详细安装步骤&#xff0c;可以参考这个帖子&#xff0c;说的非常详细&#xff01; win10下pytorch-gpu安装以及CUDA详细安装过程 仅在此记录一下我的两台电脑安装的环境 目录 一、笔记本环境配置1.…

Leetcode-每日一题【剑指 Offer II 009. 乘积小于 K 的子数组】

题目 给定一个正整数数组 nums和整数 k &#xff0c;请找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums [10,5,2,6], k 100输出: 8解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,5,2]…

代码-【5 二叉树非递归后序遍历,找指定结点的父节点】

二叉树T按二叉链表存储&#xff0c;求指定结点q的父节点&#xff1a;

通过一次线上问题,讲下Ribbon重试机制

前言 前段时间&#xff0c;产品经理在线上验证产品功能的时候&#xff0c;发现某个功能不符合需求预期&#xff0c;后来测试验证发现是服务端的一个接口大概率偶现超时&#xff0c;前端做了兜底处理&#xff0c;所以对线上用户么有太大影响。 问题排查过程 由于服务端的接口…

【暑期每日一练】 day8

目录 选择题 &#xff08;1&#xff09; 解析&#xff1a; &#xff08;2&#xff09; 解析&#xff1a; &#xff08;3&#xff09; 解析&#xff1a; &#xff08;4&#xff09; 解析&#xff1a; &#xff08;5&#xff09; 解析&#xff1a; 编程题 题一 描述…

简单聊聊创新与创造力

文章目录 前言一、大脑运行的两种方式1、聚焦模式2、发散模式3、影响想法的因素a、背景知识b、兴趣c、天赋 4、思维固化 二、想法的不可靠1、对想法进行验证2、颠覆性创新&#xff0c;挤牙膏式创新3、为什么模仿这么多 三、更多更多的idea1、个人的方面a、积累不同的背景知识b、…

怎么在线修改图片?分享一个图片修改工具

无论是在个人或商业领域&#xff0c;我们都需要使用高质量的图片来传达信息或提高品牌形象。大尺寸的图片也会占据大量的存储空间和带宽&#xff0c;影响网站的加载速度和用户体验。因此&#xff0c;我们需要一种高效的工具来解决这个问题。今天向大家介绍一款非常实用的图片处…

(学习笔记-内存管理)内存分段、分页、管理与布局

内存分段 程序是由若干个逻辑分段组成的&#xff0c;比如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的&#xff0c;所以就用分段的形式把这些分段分离出来。 分段机制下&#xff0c;虚拟地址和物理地址是如何映射的&#xff1f; 分段机制下的虚拟地址由…

JetBrains 为测试自动化打造的强大 IDE-Aqua

QA 和测试工程对现代软件开发必不可少。 在 JetBrains&#xff0c;我们相信使用正确的工具对每项工作都很重要。 对我们来说&#xff0c;为自动化测试开发创建单独的工具是自然而然的事&#xff0c;因为这使我们能够满足多角色软件开发团队的需求。 我们很高兴能够推出 JetBra…

【Vscode】远程内存占用大

查看远程服务器上的扩展 依次删除&#xff0c;重新连接后观察内存占用 此扩展占用较高&#xff0c;约2G&#xff08;前后端项目&#xff0c;依赖较多导致&#xff09;

JS前端读取本地上传的File文件对象内容(包括Base64、text、JSON、Blob、ArrayBuffer等类型文件)

读取base64图片File file2Base64Image(file, cb) {const reader new FileReader();reader.readAsDataURL(file);reader.onload function (e) {cb && cb(e.target.result);//即为base64结果}; }, 读取text、JSON文件File readText(file, { onloadend } {}) {const re…

一个写了3年半flutter的小伙,突然写了2个月uniapp的感悟!

前言 因为某些原因&#xff0c;在过去的三年半时间&#xff0c;我除了flutter之外&#xff0c;很少接触其他的框架&#xff0c;期间除了学习了Android&#xff08;主要是Kotlin、jetpack&#xff09;、GoLang Gin之外基本上很少接触其他的框架。而在最近的两个月&#xff0c;突…

如何基于 Apache Doris 构建新一代日志分析平台

作者&#xff1a;肖康&#xff0c;SelectDB 技术 副总裁 、Apache Doris Committer 日志数据是企业大数据体系中重要的组成部分之一&#xff0c;这些数据记录了网络设备、操作系统以及应用程序的详细历史行为&#xff0c;蕴含了丰富的信息价值&#xff0c;在可观测性、网络安全…

项目篇:Echo论坛系统项目

一、登录注册模块 1、注册功能 1.1、注册流程图 1.2、注册代码 /*** 用户注册* param user* return Map<String, Object> 返回错误提示消息&#xff0c;如果返回的 map 为空&#xff0c;则说明注册成功*/public Map<String, Object> register(User user) {Map&l…

YOLOv8实现K折交叉验证教程:解决数据集样本稀少和类别不平衡的难题

本篇博文为大家讲解 YOLOv8 实现 k折交叉验证的流程,包含代码使用和讲解。 K折交叉验证 概念 K折交叉验证 (K-fold cross-validation) 是一种常用于评估机器学习模型性能的技术。 它可以更充分地利用有限的数据集,减少由于数据划分不当而引起的偏差,提高模型的泛化能力。…

计算机里基本硬件的组成以及硬件协同

文章目录 冯诺依曼体系输入设备输出设备存储器运算器控制器协同工作的流程 冯诺依曼体系 世界上第一台通用计算机&#xff0c;ENIAC&#xff0c;于1946年诞生于美国一所大学。 ENIAC研发的前期&#xff0c;需要工作人员根据提前设计好的指令手动接线&#xff0c;以这种方式输入…