Flutter与FastAPI的OSS系统实现
作者:孙嘉成
目录
一、对象存储
二、FastAPI与对象存储
2.1 缤纷云S4服务API对接与鉴权实现
2.2 RESTful接口设计与异步路由优化
三、Flutter界面与数据交互开发
3.1 应用的创建
3.2页面的搭建
3.3 文件的上传
关键词:对象存储、FastAPI、Flutter
一、对象存储
对象存储服务(Object Storage Service,OSS)是一种以离散数据单元为操作对象的技术架构,依托分布式系统架构提供基于对象形式的数据存储服务。相较于传统数据库,对象存储在存储海量非结构化数据时具有显著优势,通过横向扩展架构实现近乎无限的存储容量;采用多副本/纠删码技术保障数据持久性;支持高并发访问确保读写性能;通过智能数据冗余机制提升存储效率。
当前主流云服务提供商均推出了自研的对象存储服务,典型代表包括阿里云OSS、腾讯云COS、华为云OBS以及缤纷云S4存储等产品。
缤纷云 S4 对象存储服务作为新一代云原生存储平台,深度融合了分布式存储技术和智能管理算法,为企业级用户提供安全可靠、弹性扩展的非结构化数据存储解决方案。下面介绍如何使用:
首先进入官网:

点击控制台进行注册和登录操作:

在桶列表中创建一个桶进行数据的存储:

添加子账户并获取桶的管理权限:


打开创建子用户的读写权限:

二、FastAPI与对象存储
2.1 缤纷云S4服务API对接与鉴权实现
查看官方文档,查看如何通过Python实现对缤纷云S4的操作。
引入 boto3 框架,在命令行中使用命令pip install boto3下载。

根据官方文档进行配置:

将其中的信息更换为自己的信息即可,打印的信息中“HTTPStatusCode”对应的值为200,即代表配置成功。
2.2 RESTful接口设计与异步路由优化
下载FastAPI框架:

创建POST接口,接收文件:

设置应用启动端口:

运行应用进行测试:

点击后在浏览器地址栏输入/docs进入FastAPI框架自带的文档进行上传文件测试:


选择文件进行上传:

返回成功信息:

三、Flutter界面与数据交互开发
3.1 应用的创建
打开命令窗口,创建Flutter应用

根据命令提示,构建项目


3.2页面的搭建
居中按钮组件
Center(child: _buildUploadButton(context: context,label: '图片上传',onPressed: invoiceUploadViewModel.uploadInvoice,isActive: !invoiceUploadViewModel.isUploading,),),
上传逻辑
Future<void> uploadInvoice() async {try {if (_isUploading) return;_isUploading = true;notifyListeners();final files = await _invoiceUploadRepository.pickFiles();if (files == null || files.isEmpty) {_isUploading = false;notifyListeners();return;}final prefs = await SharedPreferences.getInstance();final userInfo = jsonDecode(prefs.getString('userInfo')!);final userId = userInfo['user_id'] as int; // 明确类型转换final tempMessages = <String>[];for (final file in files) {try {final imageUrl = await _invoiceUploadRepository.uploadToOSS(file,userId,);final result = await _invoiceUploadRepository.submitInvoiceInfo(imageUrl,userId,);tempMessages.add('✅ ${path.basename(file.path)} 上传成功: $result');successCount++;} catch (e) {debugPrint(_getErrorMessage(e));tempMessages.add('❌ ${path.basename(file.path)} 上传失败: 发票已存在',); // 显示具体错误}notifyListeners();}_messages.addAll(tempMessages);_isUploaded = true;_messages.add('🚨 系统错误: ${_getErrorMessage(e)}');} catch (e) {} finally {_isUploading = false;notifyListeners();}}
3.3 文件的上传
Future<String> uploadToOSS(File file, int userId) async {final fileName = path.basename(file.path); // 使用 path 包获取正确文件名await uploadImage(file, userId);return 'https://fapiao.s3.bitiful.net/images/$userId/$fileName'; // 修正路径拼接}
文件成功上传:

相关文章:
Flutter与FastAPI的OSS系统实现
作者:孙嘉成 目录 一、对象存储 二、FastAPI与对象存储 2.1 缤纷云S4服务API对接与鉴权实现 2.2 RESTful接口设计与异步路由优化 三、Flutter界面与数据交互开发 3.1 应用的创建 3.2页面的搭建 3.3 文件的上传 关键词:对象存储、FastAPI、Flutte…...
Kubernetes控制平面组件:API Server详解(二)
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
MySQL-锁机制3-意向共享锁与意向排它锁、死锁
文章目录 一、意向锁二、死锁应该如何避免死锁问题? 总结 一、意向锁 在表获取共享锁或者排它锁时,需要先检查该表有没有被其它事务获取过X锁,通过意向锁可以避免大量的行锁扫描,提升表获取锁的效率。意向锁是一种表级锁…...
报告系统状态的连续日期 mysql + pandas(连续值判断)
本题用到知识点:row_number(), union, date_sub(), to_timedelta()…… 目录 思路 pandas Mysql 思路 链接:报告系统状态的连续日期 思路: 判断连续性常用的一个方法,增量相同的两个列的差值是固定的。 让日期与行号 * 天数…...
pytest自动化中关于使用fixture是否影响用例的独立性
第一个问题:难道使用fixture 会影响用例独立吗? ✅ 简单回答: 使用 fixture ≠ 不独立。 只要你的 fixture 是每次测试都能自己运行、自己产生数据的,那么测试用例依然是“逻辑独立”的。 ✅ 怎么判断 fixture 是否影响独立性&a…...
Token与axios拦截器
目录 一、Token 详解 1. Token 的定义与作用 2. Token 的工作流程 3. Token 的优势 4. Token 的安全实践 5. JWT 结构示例 二、Axios 拦截器详解 1. 拦截器的作用 2. 请求拦截器 3. 响应拦截器 4. 拦截器常见场景 5. 移除拦截器 三、完整代码示例 四、总结 五、…...
unity3d实现物体闪烁
unity3d实现物体闪烁,代码如下: using UnityEngine;public class Test : MonoBehaviour {//创建一个常量,用来接收时间的变化值private float shake;//通过控制物体的MeshRenderer组件的开关来实现物体闪烁的效果private MeshRenderer BoxColliderClick…...
C#—Lazy<T> 类型(延迟初始化/懒加载模式)
C# 的 Lazy<T> 类型 Lazy<T> 是 C# 中的一个类,用于实现延迟初始化(懒加载)模式。它提供了一种线程安全的方式来延迟创建大型或资源密集型对象,直到第一次实际需要时才进行初始化。 主要特点 延迟初始化:…...
Spring Boot 项目启动命令解析
Spring Boot 项目启动命令参数 一、启动命令基础格式 java [JVM参数] [Spring Boot参数] -jar your-project.jar必选部分:java -jar your-project.jar 启动可执行 JAR 包。 可选部分: JVM 参数:控制 Java 虚拟机行为(如内存、垃…...
为什么 Docker 容器中有额外的目录(如 `/dev`、`/proc`、`/sys`)?及 `docker run` 详细执行过程
、当你使用 docker run 启动一个基于极简镜像(如 scratch 或手动构建的镜像)的容器时,发现容器内出现了 /dev、/proc、/sys 等目录,即使你的镜像中并未包含这些目录。这是因为 Docker 在启动容器时,会自动挂载一些必要…...
Tailwind 武林奇谈:bg-blue-400 失效,如何重拾蓝衣神功?
前言 江湖有云,Tailwind CSS,乃前端武林中的轻功秘籍。习得此技,排版如行云流水,配色似御风随形,收放自如,随心所欲。 某日,小侠你奋笔敲码,正欲施展“蓝衣神功”(bg-blue-400),让按钮怒气冲冠、蓝光满面,怎料一招使出,画面竟一片白茫茫大地真干净,毫无半点杀气…...
【Docker 运维】Java 应用在 Docker 容器中启动报错:`unable to allocate file descriptor table`
文章目录 一、根本原因二、判断与排查方法三、解决方法1、限制 Docker 容器的文件描述符上限2、在执行脚本中动态设置ulimit的值3、升级至 Java 11 四、总结 容器内执行脚本时报错如下,Java 进程异常退出: library initialization failed - unable to a…...
开始放飞之先搞个VSCode
文章目录 开始放飞之先搞个VSCode重要提醒安装VSCode下载MinGW-w64回到VSCode中去VSCode原生调试键盘问题遗留问题参考文献 开始放飞之先搞个VSCode 突然发现自己的新台式机上面连个像样的编程环境都没有,全是游戏了!!!ÿ…...
基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线。输出指标包括最小平均流动时间,最大完工时间,最小间隙时间。 2…...
【仿Mudou库one thread per loop式并发服务器实现】SERVER服务器模块实现
SERVER服务器模块实现 1. Buffer模块2. Socket模块3. Channel模块4. Poller模块5. EventLoop模块5.1 TimerQueue模块5.2 TimeWheel整合到EventLoop5.1 EventLoop与线程结合5.2 EventLoop线程池 6. Connection模块7. Acceptor模块8. TcpServer模块 1. Buffer模块 Buffer模块&…...
基于Redis实现高并发抢券系统的数据同步方案详解
在高并发抢券系统中,我们通常会将用户的抢券结果优先写入 Redis,以保证系统响应速度和并发处理能力。但数据的最终一致性要求我们必须将这些结果最终同步到 MySQL 的持久化库中。本文将详细介绍一种基于线程池 Redis Hash 扫描的异步数据同步方案&#…...
SPL 量化 序言
序言 量化交易是通过数学模型、统计学方法和计算机技术,将市场行为转化为可执行的交易策略的自动化投资方式。其核心是通过大数据分析、机器学习和金融工程等技术,从历史数据中挖掘市场规律,预测价格趋势并生成交易信号。 量化交易的实现通…...
【LLM Prompt】CoT vs.ToT
CoT(Chain of Thought) Definition: CoT refers to the method of prompting a language model to generate responses in a step-by-step manner, explicitly showing the reasoning process leading to the final answer.定义: CoT 是一种提示语言模型…...
uniapp h5接入地图选点组件
uniapp h5接入地图选点组件 1、申请腾讯地图key2、代码接入2.1入口页面 (pages/map/map)templatescript 2.2选点页面(pages/map/mapselect/mapselect)templatescript 该内容只针对uniapp 打包h5接入地图选点组件做详细说明&#x…...
【Rust 精进之路之第13篇-生命周期·进阶】省略规则与静态生命周期 (`‘static`)
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:让编译器“读懂”你的意图——省略的艺术 在上一篇【生命周期入门】中,我们理解了生命周期的必要性——它是 Rust 编译器用来确保引用有效性、防止悬垂引用的关键机制。我…...
OSI模型和传输过程
OSI模型概述 OSI(Open Systems Interconnection)模型是由国际标准化组织(ISO)提出的一个概念性框架,用于标准化网络通信功能。它将网络通信分为七层,每一层负责特定的功能,并通过接口与相邻层交…...
MySQL-CASE WHEN条件语句
介绍 MySQL 中的一种流程控制语法结构,用于在 SQL 查询中实现条件逻辑。它允许你根据一个或多个条件的真假来返回不同的值。可以根据某些条件对数据进行分类或者转换。 使用方式 简单 CASE 表达式 CASE input_expressionWHEN when_expression THEN result_expre…...
【随缘更新,免积分下载】Selenium chromedriver驱动下载(最新版135.0.7049.42)
目录 一、chromedriver概述 二、chromedriver使用方式 三、chromedriver新版本下载🔥🔥🔥 四、Selenium与Chrome参数设置🔥🔥 五、Selenium直接操控已打开的Chrome浏览器🔥🔥🔥…...
jenkins批量复制Job项目的shell脚本实现
背景 现在需要将“测试” 目录中的所有job全部复制到 一个新目录中 test2。可以结合jenkins提供的apilinux shell 进行实现。 测试目录的实际文件夹名称是 test。 脚本运行效果如下: [qdevsom5f-dev-hhyl shekk]$ ./copy_jenkins_job.sh 创建文件夹 test2 获取源…...
iOS Google登录
iOS Google登录 SDK下载地址在 Firebase 有下载,要下载整个SDK文件,然后拿其中的Google 登录SDK来使用 Firebase 官方文档 github 下载链接...
嵌入式工程师( C / C++ )笔试面试题汇总
注:本文为 “嵌入式工程师笔试面试题” 相关文章合辑。 未整理去重。 如有内容异常,请看原文。 嵌入式必会 C 语言笔试题汇总 Z 沉浮 嵌入式之旅 2021 年 01 月 19 日 00:00 用预处理指令 #define 声明一个常数,用以表明 1 年中有多少秒&a…...
重构便携钢琴专业边界丨特伦斯便携钢琴V30Pro定义新一代便携电钢琴
在便携电钢琴领域,特伦斯推出的V30Pro折叠钢琴以"技术革新场景适配"的双重升级引发关注。这款产品不仅延续了品牌标志性的折叠结构,更通过声学系统重构与智能交互优化,重新定义了便携乐器的专业边界。 ▶ 核心特点:技术…...
DiffuRec: A Diffusion Model for Sequential Recommendation
DiffuRec: A Diffusion Model for Sequential Recommendation Background 序列推荐(Sequential Recommendation, SR)领域,主流方法是将用户与物品表示为fixed embedding。然而,这种静态向量表达方式难以全面刻画用户多样化的兴趣…...
多模态大语言模型arxiv论文略读(三十三)
Jailbreaking Attack against Multimodal Large Language Model ➡️ 论文标题:Jailbreaking Attack against Multimodal Large Language Model ➡️ 论文作者:Zhenxing Niu, Haodong Ren, Xinbo Gao, Gang Hua, Rong Jin ➡️ 研究机构: Xidian Univer…...
IntelliJ IDEA download JDK
IntelliJ IDEA download JDK 自动下载各个版本JDK,步骤 File - Project Structure (快捷键 Ctrl Shift Alt S) 如果下载失败,换个下载站点吧。一般选择Oracle版本,因为java被Oracle收购了 好了。 花里胡哨&#…...
