方向不对,努力白费,经验类测试技术才是职场重要保险! | (点击→)【提醒】AI赋能的前提是对常规测试技术非常的熟悉,联系作者vx了解

FastAPI系列(09):文件上传

 

本系列汇总,请查看这里https://www.cnblogs.com/uncleyong/p/19503695

上传单个小文件(bytes类型)

示例

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


app = FastAPI()


@app.post("/file")
async def get_file(file: bytes = File()):  # file是字节类型,= File():使用FastAPI的File()依赖注入,接收上传文件的字节数据
    # 适合小文件上传
    print("file", file)
    return {
        "file": len(file)  # 获取字节数
    }


if __name__ == '__main__':
    uvicorn.run("upload:app", port=8001, reload=True)

  

接口文档

image

 

请求

image

 

响应结果

image

 

image

 

上传多个小文件(bytes类型)

接口文档

image

 

 

请求数据

image

 

 

响应结果

image

 

image

 

 

上传单个各种大小文件(UploadFile类型)

file: UploadFile:类型注解表示参数 file 是 UploadFile 对象类型,UploadFile是FastAPI 提供的专门用于文件上传的对象,比 bytes 更功能丰富

UploadFile vs byte

image

 

示例

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


app = FastAPI()


@app.post("/uploadFile")
async def get_file(file: UploadFile):  # 比bytes更功能丰富
    # 适合各种大小文件上传
    print("file", file)


    return {
        "fileName": file.filename, "fileSize":file.size
    }


if __name__ == '__main__':
    uvicorn.run("upload:app", port=8001, reload=True)

  

接口文档

image

 

请求数据

image

 

响应结果

image

 

image

file UploadFile(filename='test.png', size=3881, headers=Headers({'content-disposition': 'form-data; name="file"; filename="test.png"', 'content-type': 'image/png'}))
INFO:     127.0.0.1:60952 - "POST /uploadFile HTTP/1.1" 200 OK

  

上传保存到目录

py文件同目录下创建imgs目录

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


app = FastAPI()


@app.post("/uploadFile")
async def upload_file(file: UploadFile):  # 比bytes更功能丰富
    # 适合各种大小文件上传
    print("file", file)

    path = os.path.join("imgs", file.filename)
    #  文件保存
    with open(path, "wb") as f:
        for line in file.file:
            print("line", line)
            f.write(line)

    return {
        "fileName": file.filename, "fileSize":file.size
    }


if __name__ == '__main__':
    uvicorn.run("upload:app", port=8001, reload=True)

 

响应结果

image

 

image

 

上传成功

image

image

 

上传多个各种大小文件(UploadFile类型)

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


app = FastAPI()


@app.post("/uploadFile")
async def upload_file(file: UploadFile):  # 比bytes更功能丰富
    # 适合各种大小文件上传
    print("file", file)

    path = os.path.join("imgs", file.filename)
    #  文件保存
    with open(path, "wb") as f:
        for line in file.file:
            print("line", line)
            f.write(line)

    return {
        "fileName": file.filename, "fileSize":file.size
    }


@app.post("/uploadFiles")
async def upload_files(files: List[UploadFile]):
    # 适合各种大小文件上传
    print("file", files)

    for file in files:
        path = os.path.join("imgs", file.filename)
        #  文件保存
        with open(path, "wb") as f:
            for line in file.file:
                # print("line", line)
                f.write(line)

    return {
        "filenames": [file.filename for file in files]
    }

if __name__ == '__main__':
    uvicorn.run("upload:app", port=8001, reload=True)

  

接口文档

image

 

请求数据

image

 

响应结果

image

 

image

file [UploadFile(filename='test.png', size=3881, headers=Headers({'content-disposition': 'form-data; name="files"; filename="test.png"', 'content-type': 'image/png'})), UploadFile(filename='test2.png', size=3881, headers=Headers({'content-disposition': 'form-data; name="files"; filename="test2.png"', 'content-type': 'image/png'}))]
INFO:     127.0.0.1:61454 - "POST /uploadFiles HTTP/1.1" 200 OK

  

image

 

优化:文件上传终极版本

from fastapi import FastAPI, UploadFile
import uvicorn
import os


app = FastAPI()


@app.post("/uploadFile")
async def upload_file(file: UploadFile):
    # print("file", file)

    path = os.path.join("imgs", file.filename)
    #  文件保存
    with open(path, "wb") as f:
        for chunk in iter(lambda: file.file.read(1024), b''):
            f.write(chunk)

    return {
        "fileName": file.filename, "fileSize":file.size
    }


if __name__ == '__main__':
    uvicorn.run("upload:app", port=8001, reload=True)

  

说明:

for chunk in iter(lambda: file.file.read(1024), b''):

这行代码使用 iter() 函数创建了一个迭代器,用于流式读取文件内容。


语法结构分析

  • lambda: file.file.read(1024):无参数 lambda 函数,每次调用读取 1024 字节
  • b'':停止条件,当读取结果为空字节串时停止迭代
  • for chunk in iter(...):遍历每个 1024 字节的数据块

工作原理

  • 分块读取:每次读取 1024 字节的数据块(chunk)
  • 持续迭代:直到文件结束返回空字节串 b''
  • 内存优化:避免一次性加载大文件到内存

这样可以:

  1. 避免一次性读取整个文件
  2. 有效控制内存使用
  3. 适合大文件处理场景

 

posted @ 2026-01-25 16:30  全栈测试笔记  阅读(0)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end