当前位置: 首页 > news >正文

fastapi实现文件上传和下载的功能

基础代码

import os
import io
from fastapi import FastAPI, File, UploadFile, Responseapp = FastAPI()# 设置上传文件的保存目录
UPLOAD_FOLDER = 'data'
# 确保上传目录存在
os.makedirs(UPLOAD_FOLDER, exist_ok=True)@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):# 获取文件名filename = file.filename# 读取文件内容file_content = await file.read()# 保存文件到磁盘save_file_path = os.path.join(UPLOAD_FOLDER, filename)with open(save_file_path, 'wb') as f:f.write(file_content)return {"message": "文件上传成功", "filename": file.filename}@app.get("/download/")
def download_file():# 假设你有一个文件的内容和名称file_content = b"abc"file_name = "example.txt"response = Response(content=file_content, media_type="text/plain")response.headers["Content-Disposition"] = f"attachment; filename={file_name}"return responseif __name__ == '__main__':import uvicornuvicorn.run(app, host='0.0.0.0', port=8000)

上传文件并提取文件信息保存到数据库

import os
import uuid
import time
import fastzdp_upload
from fastapi import FastAPI, File, UploadFile, Response,Depends
from sqlmodel import SQLModel, Field, create_engine, Session
from typing import Optional# 创建数据库引擎
sqlite_url = "mysql+pymysql://root:root@127.0.0.1:3306/test?charset=utf8mb4"
engine = create_engine(sqlite_url, echo=True)class FileModel(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)name: str = Field(index=True)uuid: strsuffix: strmd5: strsave_dir: strpath: strorigin_name: strsize: intadd_time: int# 确保表存在
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)def get_db():db = Session(engine)try:yield dbfinally:db.close()app = FastAPI()# 设置上传文件的保存目录
UPLOAD_FOLDER = 'data'
# 确保上传目录存在
os.makedirs(UPLOAD_FOLDER, exist_ok=True)@app.post("/upload/")
async def upload_file(file: UploadFile = File(...), db: Session = Depends(get_db),):# 获取文件名filename = file.filenameuuid_value = str(uuid.uuid4())filename = f"{uuid_value}_{filename}"# 读取文件内容file_content = await file.read()# 保存文件到磁盘save_file_path = os.path.join(UPLOAD_FOLDER, filename)with open(save_file_path, 'wb') as f:f.write(file_content)# 文件信息保存到数据库db_file = FileModel(name=filename,uuid=uuid_value,suffix=fastzdp_upload.util.get_suffix(filename),md5=fastzdp_upload.util.get_md5(file_content),save_dir=UPLOAD_FOLDER,path=f"{UPLOAD_FOLDER}/{filename}",origin_name=file.filename,size=len(file_content),add_time = time.time(),)db.add(db_file)db.commit()return {"message": "文件上传成功", "filename": file.filename}@app.get("/download/")
def download_file():# 假设你有一个文件的内容和名称file_content = b"abc"file_name = "example.txt"response = Response(content=file_content, media_type="text/plain")response.headers["Content-Disposition"] = f"attachment; filename={file_name}"return responseif __name__ == '__main__':import uvicornuvicorn.run(app, host='0.0.0.0', port=8000)

使用封装的方法

import fastzdp_upload
from fastapi import FastAPI
from sqlmodel import SQLModel, Field, create_engine, Session# 创建数据库引擎
sqlite_url = "mysql+pymysql://root:root@127.0.0.1:3306/test?charset=utf8mb4"
engine = create_engine(sqlite_url, echo=True)# 确保表存在
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)def get_db():db = Session(engine)try:yield dbfinally:db.close()app = FastAPI()app.include_router(fastzdp_upload.get_router(get_db))if __name__ == '__main__':import uvicornuvicorn.run(app, host='0.0.0.0', port=8000)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python基于逻辑回归的L1正则化(Lasso Logistic Regression)进行分类数据的特征选择项目实战
  • 每天一个数据分析题(四百六十)- 麦肯锡
  • C++自定义接口类设计器之可对称赋值三
  • elk+filebeat+kafka集群部署
  • 抖音小店新宠儿成都夏光汝网络科技
  • 对优先级队列(堆)的理解
  • 【工具】-gdb-学习笔记
  • 推动未来的引擎:人工智能大模型的现状与发展
  • 基于改进拥挤距离的多模态多目标优化差分进化(MMODE-ICD)求解无人机三维路径规划(MATLAB代码)
  • 云计算学习——5G网络技术
  • 前端开发者必备:揭秘谷歌F12调试的隐藏技巧!
  • PixelMaster - 图片像素化终极利器 !
  • U盘数据恢复不再难:2024年4款工具,找回你“躲藏”的记忆
  • BootStrap前端面试常见问题
  • 【刷题汇总 -- 爱吃素、相差不超过k的最多数、最长公共子序列(一)】
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【EOS】Cleos基础
  • bearychat的java client
  • CentOS7 安装JDK
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • javascript从右向左截取指定位数字符的3种方法
  • js ES6 求数组的交集,并集,还有差集
  • Linux CTF 逆向入门
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 前端自动化解决方案
  • 微信公众号开发小记——5.python微信红包
  • 与 ConTeXt MkIV 官方文档的接驳
  • 主流的CSS水平和垂直居中技术大全
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ​业务双活的数据切换思路设计(下)
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • $(function(){})与(function($){....})(jQuery)的区别
  • ()、[]、{}、(())、[[]]命令替换
  • (9)STL算法之逆转旋转
  • (C语言)fgets与fputs函数详解
  • (Forward) Music Player: From UI Proposal to Code
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (回溯) LeetCode 46. 全排列
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转载)从 Java 代码到 Java 堆
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Core 2.1路线图
  • .Net MVC4 上传大文件,并保存表单
  • .NET 直连SAP HANA数据库
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • ::