1月第一讲:WxPython跨平台开发框架之前后端结合实现附件信息的上传及管理

1、功能描述和界面

  • 前端(wxPython GUI)
    • 提供文件选择、显示文件列表的界面。
    • 支持上传、删除和下载附件。
    • 展示上传状态和附件信息(如文件名、大小、上传时间)。
  • 后端(REST API 服务)
    • 提供上传、删除、获取附件信息的接口。
    • 使用常见的 Web 框架(如 Flask 或 FastAPI)实现。

首先前端我们需要一个对所有附件进行管理的界面,以便对于附件进行统一的维护处理。

前端发起上传附件的处理,如下界面所示,可以选择多个不同类型的文件。

 上传成功后,我们可以打开附件信息记录,如果是图片会显示出来,如果是其他格式,可以通过打开链接方式下载查看。

2、功能的实现处理

如果附件是简单的上传,比较容易处理,我们可以先了解一下简单的做法,然后在深入探讨实际框架中对于附件的处理。

1) FastAPI 端实现文件上传接口

首先,在 FastAPI 中创建一个接收文件的接口:

复制代码

from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
    with open(file.filename, "wb") as f:
        f.write(await file.read())
    return {"filename": file.filename}

复制代码

在公布对应的API接口后,在 前端的 wxPython 项目中,您可以通过 requests 库 或者 aiohttp 库 与 FastAPI 交互来实现文件上传。以下是简单的实现步骤和示例代码

复制代码

import wx
import requests

class FileUploadFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        panel = wx.Panel(self)
        self.upload_button = wx.Button(panel, label="上传文件", pos=(20, 20))
        self.upload_button.Bind(wx.EVT_BUTTON, self.on_upload)

        self.status_text = wx.StaticText(panel, label="", pos=(20, 60))

    def on_upload(self, event):
        with wx.FileDialog(
            self, "选择文件", wildcard="所有文件 (*.*)|*.*",
            style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST
        ) as file_dialog:
            if file_dialog.ShowModal() == wx.ID_CANCEL:
                return  # 用户取消选择

            # 获取文件路径
            file_path = file_dialog.GetPath()
            try:
                self.upload_file(file_path)
            except Exception as e:
                wx.LogError(f"文件上传失败: {e}")

    def upload_file(self, file_path):
        url = "http://127.0.0.1:8000/upload/"  # FastAPI 服务器的上传接口
        with open(file_path, "rb") as file:
            files = {"file": file}
            response = requests.post(url, files=files)
        
        if response.status_code == 200:
            self.status_text.SetLabel(f"上传成功: {response.json().get('filename')}")
        else:
            self.status_text.SetLabel(f"上传失败: {response.status_code}")

if __name__ == "__main__":
    app = wx.App(False)
    frame = FileUploadFrame(None, title="文件上传", size=(300, 150))
    frame.Show()
    app.MainLoop()

复制代码

2) 上传多个文件的处理方式

上面是单个文件的上传处理,如果要一次性提交多个文件到 FastAPI 接口,可以使用 FastAPI 的 List[UploadFile] 类型接收多个文件。以下是完整的实现方法。

复制代码

from fastapi import FastAPI, File, UploadFile
from typing import List

app = FastAPI()

@app.post("/upload/")
async def upload_files(files: List[UploadFile] = File(...)):
    saved_files = []
    for file in files:
        file_path = f"./uploaded/{file.filename}"  # 保存到 uploaded 目录
        with open(file_path, "wb") as f:
            f.write(await file.read())
        saved_files.append(file.filename)
    return {"uploaded_files": saved_files}

https://book.qq.com/book-search/%E5%90%8D%E4%BC%98%E9%A6%86%E7%BD%91%E3%80%9023Y4.com%E3%80%91?c31a
https://book.qq.com/book-search/%E6%B5%B7%E8%A7%92%E7%A4%BE%E5%8C%BA%E3%80%9023Y4.com%E3%80%91?c31b
https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E7%BD%91%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31c
https://book.qq.com/book-search/%E6%9E%9C%E5%86%BB%E4%BC%A0%E5%AA%92%E3%80%9023Y4.com%E3%80%91?c31d
https://book.qq.com/book-search/%E6%9E%9C%E5%86%BB%E4%BC%A0%E5%AA%92%E8%BF%9B23Y4.com%E7%9C%8B?c31e
https://book.qq.com/book-search/%E6%80%A7%E5%B7%B4%E5%85%8B%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31f
https://book.qq.com/book-search/%E7%88%B1%E5%A8%81%E5%A5%B6%E7%BD%91%E3%80%9023Y4.com%E3%80%91?c31g
https://book.qq.com/book-search/%E7%A6%81%E6%BC%AB%E5%A4%A9%E5%A0%82%E3%80%9023Y4.com%E3%80%91?c31h
https://book.qq.com/book-search/%E6%92%B8%E6%92%B8%E7%A4%BE%E7%BD%91%E3%80%9023Y4.com%E3%80%91?c31i
https://book.qq.com/book-search/%E6%8A%96%E9%98%B4%E4%B8%8B%E8%BD%BD%E3%80%8A23Y4.com%E3%80%8B?c31i
https://book.qq.com/book-search/%E6%8A%96%E9%98%B4%E7%BD%91%E7%AB%99%E3%80%9023Y4.com%E3%80%91?c31k
https://book.qq.com/book-search/%E4%B9%85%E4%B9%85%E7%83%AD%E7%9C%8B%E3%80%9023Y4.com%E3%80%91?c31l
https://book.qq.com/book-search/%E4%B9%85%E4%B9%85%E7%83%AD%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31m
https://book.qq.com/book-search/%E6%92%B8%E6%92%B8%E7%A4%BE%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31n
https://book.qq.com/book-search/%E4%B8%8B%E8%BD%BD%E6%8A%96%E9%98%B4%E3%80%9023Y4.com%E3%80%91?c31o

https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E5%9C%B0%E5%9D%80%E3%80%9023Y4.com%E3%80%91?c31p
https://book.qq.com/book-search/%E7%9C%8B%E8%89%B3%E6%AF%8D%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31q
https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E7%9C%8B%E8%BF%99%E3%80%9023Y4.com%E3%80%91?c31r
https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E5%9C%B0%E5%9D%80%E8%BF%9B23Y4.com%E7%9C%8B?c31s
https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E5%9C%B0%E5%9D%80%E6%9D%A523Y4.com%E7%9C%8B?c31t

复制代码

而在前端WxPython的处理中,需要对多个文件进行上传处理即可,可以使用 wx.FileDialog 的多选功能,并通过 requests 库批量上传多个文件。

复制代码

import wx
import requests

class MultiFileUploadFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        panel = wx.Panel(self)
        self.upload_button = wx.Button(panel, label="上传多个文件", pos=(20, 20))
        self.upload_button.Bind(wx.EVT_BUTTON, self.on_upload)

        self.status_text = wx.StaticText(panel, label="", pos=(20, 60), size=(300, -1))

    def on_upload(self, event):
        with wx.FileDialog(
            self, "选择文件", wildcard="所有文件 (*.*)|*.*",
            style=wx.FD_OPEN | wx.FD_MULTIPLE
        ) as file_dialog:
            if file_dialog.ShowModal() == wx.ID_CANCEL:
                return  # 用户取消选择

            # 获取选择的多个文件路径
            file_paths = file_dialog.GetPaths()
            try:
                self.upload_files(file_paths)
            except Exception as e:
                wx.LogError(f"文件上传失败: {e}")

    def upload_files(self, file_paths):
        url = "http://127.0.0.1:8000/upload/"  # FastAPI 服务器的上传接口
        files = [("files", (file_path.split("/")[-1], open(file_path, "rb"))) for file_path in file_paths]
        
        response = requests.post(url, files=files)
        
        if response.status_code == 200:
            uploaded_files = response.json().get("uploaded_files", [])
            self.status_text.SetLabel(f"上传成功: {', '.join(uploaded_files)}")
        else:
            self.status_text.SetLabel(f"上传失败: {response.status_code}")

if __name__ == "__main__":
    app = wx.App(False)
    frame = MultiFileUploadFrame(None, title="多文件上传", size=(400, 200))
    frame.Show()
    app.MainLoop()

复制代码

不过我们附件的上传,往往还需要伴随着一些额外的信息,方便把这些信息存储在数据库中供查询参考,同时也是关联业务模块和附件信息的重要依据。

如果需要在上传多个文件的同时传递额外参数(如 guid 和 folder),可以将这些参数通过 POST 请求的表单数据 (data) 传递。FastAPI 可以同时处理文件和表单数据。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务SpringCloud分布式事务之Seata

视频教程:https://www.bilibili.com/video/BV16P63Y3ESq 效果演示 准备的微服务项目调用的链路如下: 文字描述: gateway模块接收到请求,并发送到order订单模块order订单模块接收到请求,新增一个订单数据后发送一个…

Solon 加入 GitCode:助力国产 Java 应用开发新飞跃

在当今数字化快速发展的时代,Java 应用开发框架不断演进,开发者们始终在寻找更快、更小、更简单的解决方案。近期,Solon 正式加入 GitCode,为广大 Java 开发者带来全新的开发体验,尤其是在国产应用开发进程中&#xff…

[实用指南]如何将视频从iPhone传输到iPad

概括 将视频从 iPhone 传输到 iPad 时遇到问题?您可能知道一种方法,但不知道如何操作。此外,您要传输的视频越大,完成任务就越困难。那么如何将视频从 iPhone 传输到 iPad,特别是当您需要发送大视频文件时&#xff1f…

【一起python】银行管理系统

文章目录 📝计算机基础概念🌠 导入模块🌠定义input_card_info函数🌠 定义check_password函数🌠初始化用户字典和欢迎信息🌉 主循环🌉开户操作🌉查询操作🌉取款操作&#…

20241218-信息安全理论与技术复习题

20241218-信息安全理论与技术复习题 一、习题1 信息安全的基本属性是(D )。 A、机密性 B、可用性 C、完整性 D、上面 3 项都是 “会话侦听和劫持技术” 是属于(B)的技术。 A、 密码分析还原 B、 协议漏洞渗透 C、 应用漏洞分析与渗透 D、 D…

音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件

一、错误的命令 通过FFmpeg命令可以将mp4文件转换为ps文件,PS文件中包含PS流数据。 由于PS流/PS文件对应的FFInputFormat结构为: const FFInputFormat ff_mpegps_demuxer {.p.name "mpeg",.p.long_name NULL_IF_CONFIG_SMALL…

Unity is running as administrator解决办法

每次打开Unity项目都会有这个弹窗 解决办法: 打开本地安全策略 - 安全选项 ,把 用户账户控制:以管理员批准模式运行所有管理员 用户账户控制:用于内置管理员账户的管理员批准模式 改成已启用就行

活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识

课程介绍 参加“Azure 在线技术公开课:数据基础知识”活动,了解有关云环境和数据服务中核心数据库概念的基础知识。通过本次免费的介绍性活动,你将提升在关系数据、非关系数据、大数据和分析方面的技能。 活动时间:01 月 07 日…

SQL-leetcode-183. 从不订购的客户

183. 从不订购的客户 Customers 表: -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | -------------------- 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Orders 表&#…

HTML5滑块(Slider)

HTML5 的滑块&#xff08;Slider&#xff09;控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例&#xff1a; <…

报错:websocket注入为null,已解决!

错误截图 原因分析&#xff1a; WebSocket 在 Spring 框架中的注入问题是由其生命周期与 Spring 容器的作用域不一致引起的。spring管理的都是单例&#xff08;singleton&#xff09;&#xff0c;和 websocket &#xff08;多对象&#xff09;相冲突。如果你的WebSocket 处理类…

ClickHouse副本搭建

一. 副本概述 副本的目的主要是保障数据的高可用性&#xff0c;ClickHouse中的副本没有主从之分。所有的副本都是平等的。 副本写入流程&#xff1a; 二. 副本搭建 1. 实验环境 hadoop1(192.168.47.128) hadoop2(192.168.47.129)2. 修改配置文件 修改两台主机/etc/click…

ChatBI来啦!NBAI 正式上线 NL2SQL 功能

NebulaAI 现已正式上线 NL2SQL 功能&#xff0c;免费开放使用&#xff01; 什么是 NL2SQL&#xff1f;NL2SQL 即通过自然语言交互&#xff0c;用户可以轻松查询、分析和管理数据库中的数据&#xff08;ChatBI&#xff09;&#xff0c;从此摆脱传统复杂的数据库操作。 欢迎免费…

科技云报到:洞见2025年科技潮流,技术大融合开启“智算时代”

科技云报到原创。 随着2024年逐渐接近尾声&#xff0c;人们不禁开始展望即将到来的2025年。这一年&#xff0c;被众多科技界人士视为开启新纪元的关键节点。站在新的起点上&#xff0c;我们将亲眼目睹未来科技如何改变我们的世界。从人工智能到量子计算&#xff0c;从基因编辑…

【数据仓库】spark大数据处理框架

文章目录 概述架构spark 架构角色下载安装启动pyspark启动spark-sehll启动spark-sqlspark-submit经验 概述 Spark是一个性能优异的集群计算框架&#xff0c;广泛应用于大数据领域。类似Hadoop&#xff0c;但对Hadoop做了优化&#xff0c;计算任务的中间结果可以存储在内存中&a…

标准库以及HAL库——按键控制LED灯代码

按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别 点亮一个LED灯&#xff1a;是直接控制输出引脚&#xff0c;GPIO初始化推挽输出即可 按键控制LED&#xff1a;是按键输入信号从而控制输出引脚&#xff0c;GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入 但是…

Rabbitmq追问2

分析rabbitmq 默认使用姿势是什么 direct fanout还是什么 public void convertAndSend(String exchange, String routingKey, Object object, CorrelationData correlationData) throws AmqpException { this.send(exchange, routingKey, this.convertMessageIfNecessary(obje…

vue+js+Java在分页的el-table里实现上移、下移;置顶

这里写目录标题 一、上移、下移二、置顶 一、上移、下移 实现&#xff1a;上移到第一行后不能再上移&#xff0c;下移到最后一行不能下移&#xff0c;以及分页后能上移到前一页&#xff0c;下移能移到后一页&#xff1b;&#xff08;新增sort排序字段&#xff09; <el-tabl…

计算机因进程结束导致白屏

问题场景&#xff1a; 计算机卡顿利用&#xff08;右击计算机桌面底部任务栏->打开任务管理器->结束任务->或进程被意外结束导致白屏&#xff09; 问题描述 白屏 原因分析&#xff1a; 在结束进程时&#xff0c;导致 文件资源管理器 进程崩溃。 解决方案&#xf…

【YashanDB知识库】如何在备机节点上做备份和恢复

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7817898.html?templateId1718516 问题现象 一主一备情况下&#xff0c;主机需要支持常规业务&#xff0c;为了不影响业务&#xff0c;在备机做备份恢复的场景。 问题的风险及影响 1、…