FastApi 文件上传、下载实现

环境

安装FastAPI

pip install fastapi

导入

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import StreamingResponse
from pathlib import Path
from starlette.responses import Response

实现

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import FileResponse
from pathlib import Path
from starlette.responses import Response

app = FastAPI()

UPLOAD_FOLDER = './uploads'

@app.post("/files/")
async def upload_file(file: UploadFile = File(...)):
	# 读取文件内容
    contents = await file.read()
    filename = file.filename

	# 保存文件夹,可自定义
    uploads_dir = Path(UPLOAD_FOLDER)
    if not uploads_dir.exists():
        uploads_dir.mkdir(parents=True, exist_ok=True)

    # 构造完整的文件路径
    file_path = uploads_dir / file.filename

    # 写入文件
    with open(file_path, "wb+") as f:
        f.write(contents)

    return {"filename": filename, "message": f"File content type: {file.content_type}"}

@app.get("/download/{filename:path}")
async def download_file(filename: str):
    # 假设文件就在UPLOAD_FOLDER下
    file_path = Path(UPLOAD_FOLDER) / filename
    if not file_path.exists():
        return Response(status_code=404, content={"message": "File not found"})

    # 使用FileResponse来发送文件
    return FileResponse(path=file_path, filename=filename)

文本格式不能很好显示,请见谅(附件里有比较齐整的excel表格统计) 大小类型 传输类型 api方法 文件大小 花费时间 速率byte/ms 速率mb/s 缓存数组 次数 备注 大文件 下载 download_file(group_name, remote_filename, localFile) 1073741824(约1G) 28343ms 37883 36.12804413 无 1 下载 download_file(group_name, remote_filename , downloadStream) 1073741824(约1G) 29195ms 36778 35.07423401 0 1 fastDFS的DownloadStream,FileOutputStream 下载 download_file(group_name, remote_filename , downloadStream) 1073741824(约1G) 24352ms 44092 42.04940796 2K 1 fastDFS的DowloadStream,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 1073741824(约1G) 24831ms 43241 41.23783112 2K 1 实现DownloadCallback,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 1073741824(约1G) 25922ms 41422 39.50309753 8K 1 实现DownloadCallback,BufferedOutputStream 普通文件 下载 download_file(group_name, remote_filename, localFile) 59113472(约56M) 382ms 154747 147.5782394 无 1 下载 download_file(group_name, remote_filename , downloadStream) 59113472(约57M) 369ms 160199 152.7776718 0 1 fastDFS的DownloadStream,FileOutputStream 下载 download_file(group_name, remote_filename , downloadStream) 59113472(约58M) 499ms 118702 113.2030487 2K 1 fastDFS的DowloadStream,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 59113472(约59M) 592ms 99853 95.22724152 2K 1 实现DownloadCallback,BufferedOutputStream 下载建议:100M内数据使用fastDFS提供的DownloadStream;大于1G的数据,使用BufferedOutputStream和DowloadStream
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值