项目需求:实现 批量导入 功能
需求拆分:
1.接收前端上传的excel文件
2.保存excel文件至本地服务器
3.将excel文件写入Mysql数据库
后端技术:Python FastAPI 框架
实验前提:
1.已经完成Linux虚拟机的虚拟环境的搭建
2.已经完成Pycharm远程连接Linux虚拟环境
3.已经完成FastAPI基础环境的搭建
功能实现:
(1).创建目录
# 创建目录,用于存放从前端获取的文件
[root@localhost rop_test]# mkdir -p test/file
(2).编写代码
from fastapi import FastAPI, File, UploadFile, Form
app = FastAPI()
@app.post("/files/")
async def create_file(file: bytes = File(...)):
return {"file_size": len(file)}
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
return {"filename": file}
@app.post('/file/')
# 函数参数即为前端传递过来的文件/字符串
# 1.接收前端上传的文件
async def get_user(
file: bytes = File(...), # 把文件对象转为bytes类型,这种类型的文件无法保存
fileb: UploadFile = File(...), # UploadFile转为文件对象,可以保存文件到本地
notes: str = Form(...) # 获取普通键值对
):
# 2.保存前端上传的文件至本地服务器
# 2.1 读取前端上传到的fileb文件
contents = await fileb.read()
# print(contents)
# print(fileb.filename)
# 2.2 打开新文件
# 第一个参数 文件存储路径+文件名称,存储路径目录需要提前创建好,如果没有指定,则默认会保存在本文件的同级目录下
# 第二个参数 wb,表示以二进制格式打开文件,用于只写
with open("test/file/" + fileb.filename, "wb") as f:
# 2.3 将获取的fileb文件内容,写入到新文件中
f.write(contents)
# 启动服务后,会在本地FastAPI服务器的static/file/目录下生成 前端上传的文件
return ( {
'file_size': len(file),
'file_name': fileb.filename,
'notes': notes,
'file_content_type': fileb.content_type
})
备注:将excel文件写入Mysql数据库 实现方式 在之前的 博客中已经记录过了,就不再赘述了。
(3).启动服务
(rop_test) [root@localhost rop_test]# uvicorn 上传文件-简单案例:app --host '192.168.56.20' --port 8080 --reload
(4).测试
在网页中输入 192.168.56.20/docs
[root@localhost rop_test]# ll test/file/budget.xlsx
-rw-r--r--. 1 root root 13619 Mar 17 14:25 test/file/budget.xlsx
# 下载文件到桌面上
[root@localhost rop_test]# sz test/file/budget.xlsx
打开桌面上的文件,核对与上传文件是否一致。
注意点:
1.无论是从前端页面上传文件,还是 使用postman 或者 fastapi交互式文档 上传文件,测试效果都是一样的,所以不需要非得搞个前端上传文件的页面来测试。
2.接收前端传递过来的文件,其实没有那么复杂,直接写在定义接口的函数参数中即可,注意指明参数的类型为文件即可。(直接参考官网)
项目总结:
1.项目所需知识
1.1 Python FastAPI 框架 请求文件
官网地址:https://fastapi.tiangolo.com/tutorial/request-files/
1.2 Python 文件读写操作
文章链接:https://blog.csdn.net/lilygg/article/details/114922527
1.3 将excel文件写入Mysql数据库
文章链接:https://blog.csdn.net/lilygg/article/details/113882512
2.项目思维
任何一个项目需求,都可以拆分为多个小的需求功能点。要学会将复杂的事情分步骤简单化!
遇到不会的东西,不是一开始就没思想的去百度,先搞清楚要实现该功能所需要的技能,学会这些必备技能,再开始正式开发!