python fastapi 使用 UploadFile 接收多个图片文件并上传多个文件

这篇博客介绍了如何使用Python的FastAPI框架创建接口来接收单个和多个文件上传,并展示了如何通过`requests`库进行文件上传。同时,文章还展示了处理列表数据的方法以及不同格式的参数接收。FastAPI的中间件用于处理跨域请求,Pydantic模型用于数据验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 接口
import uvicorn
from typing import  List
from fastapi import FastAPI, File, UploadFile
import asyncio

app = FastAPI()
@app.post("/send_one_image") 
async def update_item(file: UploadFile = File(...),label:str=Form(None)):
    with open(f'{file.filename}.jpg','wb') as f: 
        f.write(await file.read())
    return {"res": '接收成功'}

@app.post("/send_images")
async def update_item(files: List[UploadFile] = File(...),label:str=Form(None)):
    lists = [i.filename for i in files]
    print(lists)
    count = 0
    for i in files:
        with open(f'{count}.jpg','wb') as f:
            f.write(await i.read())
        count += 1
    return {"res": len(files)}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=9315)

1.python 上传多个文件

 1.1

pip install requests_toolbelt

from requests_toolbelt.multipart.encoder import MultipartEncoder

list_urls = ['https://sun9-63.userapi.com/c638920/v638920705/1a54d/xSREwpakJD4.jpg',
 'https://sun9-28.userapi.com/c854024/v854024084/1160d8/LDMVHYgguAw.jpg',
 'https://sun9-54.userapi.com/c854220/v854220084/111f66/LdcbEpPR6tg.jpg',
 'https://sun9-40.userapi.com/c841420/v841420283/4c8bb/Mii6GSCrmpo.jpg']

headers0={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
}
fields = [("files",(i.split('/')[-1],requests.get(i,headers=headers0).content)) for i in list_urls]
#fields.append(("boundary","--WebKitFormBoundary9K7xUkVGzyQA6e6h"))
multipart_encoder = MultipartEncoder(fields)
headers2 = {"Content-Type": multipart_encoder.content_type}
resp = requests.post("http://127.0.0.1:9315/send_images", headers=headers2, data=multipart_encoder)
print(resp.text)

  1.2 上传多个文件并提交表单

list_urls = ['https://sun9-63.userapi.com/c638920/v638920705/1a54d/xSREwpakJD4.jpg',
             'https://sun9-28.userapi.com/c854024/v854024084/1160d8/LDMVHYgguAw.jpg',
             'https://sun9-54.userapi.com/c854220/v854220084/111f66/LdcbEpPR6tg.jpg',
             'https://sun9-40.userapi.com/c841420/v841420283/4c8bb/Mii6GSCrmpo.jpg']

headers0 = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
}
fields = [("files", (i.split('/')[-1], requests.get(i, headers=headers0).content)) for i in list_urls]

data = {"label":"上传表单"}
response = requests.post('http://127.0.0.1:9315/send_images',files=fields,data=data)
print(response.text)

2. 接收单个文件

image_url='https://sun9-40.userapi.com/c841420/v841420283/4c8bb/Mii6GSCrmpo.jpg'

files={'file':(image_url.split('/')[-1],requests.get(image_url,headers=headers0).content))}

data={'label':'文件'}

res = requests.post('http://127.0.0.1:9315/send_one_image',data=data,files=files)

print(res.text)

3. 接收列表数据

from typing import Optional, Union, List, Dict
from fastapi import FastAPI, File, UploadFile, Form
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
class Test_Api():

    def createOrder(self, orders):
        for params in orders:
            order_no_list = params.order_nos
            store_name = params.store_name
method_name_dic = {
    "createOrder": Test_Api().createOrder
}

app = FastAPI()

app.add_middleware( # 防止跨域
    CORSMiddleware,
    # allow_origins=origins, # 表示允许任何源
    allow_origins=["*"],  # 表示允许任何源
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


class Item(BaseModel):
    store_name: str = None
    order_nos: List = None


class GraphList(BaseModel):
    data: List[Item]
    method_name: str = None


@app.post('/create_order')
async def search(item: GraphList):
    data = item.data
    # 接收类下的方法名
    method_name = "createOrder"
    try:
        loop = asyncio.get_event_loop()
        method_ = method_name_dic[method_name]
        result_data = await loop.run_in_executor(None, method_, data)
        return result_data
    except:
        return {"errcode": 0, "errmsg": "error"}


if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8090)

#调用

url = 'http://127.0.0.1:8090/create_order'
import requests

data = {'data':
    [
        {"store_name": "xxxx", "order_nos": ["xxxx","xxxx" ]},
        {"store_name": "xxxx","purchase_order_nos": ["xxxx","xxxx"]}
    ]
}

res = requests.post(url, data=json.dumps(data))
print(res.text)

4. 接收列表参数的几种格式 

from typing import List
from pydantic import BaseModel

class Item(BaseModel):
    name: str

class ItemList(BaseModel):
    items: List[Item]

def process_item_list(items: ItemList):
    pass

这个例子将能够像解析 JSON:{"items": [{"name": "John"}, {"name": "Mary"}]}
在您的情况下 - 取决于您的列表条目的形状 - 您还需要进行适当的类型建模,但您希望直接接收和处理列表,而无需围绕它的 JSON dict 包装器。你可以去:

from typing import List
from pydantic import BaseModel

class Item(BaseModel):
    name: str

def process_item_list(items: List[Item]):
    pass

现在能够处理 JSON,如: [{"name": "John"}, {"name": "Mary"}]
如果是普通字符串,您还可以选择:

from typing import List

@app.post('/get_name')
def process_item_list(items: List[str]):
    print('items:', items)

可以像处理 JSON:["John", "Mary"]

调用:

def get_name():
    url = 'http://127.0.0.1:8090/get_name'
    import requests
    res = requests.post(url, data=json.dumps(["John", "Mary"]))
    print(res.text)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值