如何在FastAPI中实现文件上传和处理

FastAPI 是一个现代化的高性能Web框架,简单易用且功能强大,它提供了原生支持文件上传和处理的功能。在本文中,我们将学习如何在FastAPI框架中实现文件上传和处理的功能,并提供代码示例来说明具体的实现步骤。

首先,我们需要导入需要的库和模块:

from fastapi import FastAPI, UploadFile, File
from fastapi.responses import JSONResponse
import shutil
import os
登录后复制

接下来,我们需要创建一个FastAPI应用实例:

app = FastAPI()
登录后复制

现在,我们可以定义一个路由来接受文件上传请求,并将文件保存到服务器上:

@app.post("/upload/")
async def create_upload_file(file: UploadFile = File(...)):
    try:
        # 保存文件到服务器上
        with open(file.filename, "wb") as buffer:
            shutil.copyfileobj(file.file, buffer)
        
        # 返回成功的响应
        return JSONResponse({"message": "File uploaded successfully"})
    except Exception as e:
        # 返回失败的响应
        return JSONResponse({"error": str(e)}, status_code=500)
登录后复制

在上面的代码中,我们定义了一个 POST 请求路由 /upload/,它接收一个名为 file 的参数,该参数的类型是 UploadFile,我们使用 File 函数将其作为请求体中的文件进行解析。File 函数的第一个参数是文件类型的默认值,... 表示必须传递该参数,否则将会返回错误响应。

在处理文件上传请求时,我们先使用 with open 的方式创建一个文件的写入流,然后通过 shutil.copyfileobj 函数将请求体中的文件对象复制到服务器上。

当文件上传成功后,我们返回一个包含成功消息的JSON响应;如果文件上传过程中出现任何异常,我们将返回一个包含错误信息的JSON响应并设置响应状态码为500。

在文件上传功能已经实现后,我们可以继续实现文件处理功能。以下是一个示例路由,用于接受上传的图片文件,并将图片文件转换为缩略图:

@app.post("/process_image/")
async def process_image(file: UploadFile = File(...)):
    try:
        # 保存文件到服务器上
        with open(file.filename, "wb") as buffer:
            shutil.copyfileobj(file.file, buffer)
        
        # 进行图片处理,生成缩略图
        thumbnail_filename = f"thumbnail_{file.filename}"
        # 模拟图片处理过程
        # 请根据实际需求进行实现
        # ...
        
        # 返回缩略图的下载链接
        return JSONResponse({"thumbnail_url": f"/download/{thumbnail_filename}"})
    except Exception as e:
        # 返回失败的响应
        return JSONResponse({"error": str(e)}, status_code=500)
登录后复制

在上面的示例代码中,我们使用了相同的文件上传过程,然后进入图片处理的逻辑。在这里,我们使用模拟的方式来处理图片文件,生成缩略图,并将缩略图的下载链接返回给客户端。

最后,我们还可以定义一个路由来提供下载功能:

@app.get("/download/{filename}")
async def download_file(filename: str):
    try:
        # 返回文件下载链接
        return JSONResponse({"download_url": f"/file/{filename}"})
        
    except Exception as e:
        # 返回失败的响应
        return JSONResponse({"error": str(e)}, status_code=500)
登录后复制

在上面的代码中,我们定义了一个 GET 请求路由 /download/{filename},该路由接受一个文件名参数 filename,并返回该文件的下载链接。

到此,我们已经实现了在FastAPI框架中实现文件上传和处理的功能。通过上面的示例代码,我们可以了解到在FastAPI中处理文件上传和处理的基本流程,以及如何使用FastAPID的API和方法来实现这些功能。当然,具体的文件处理逻辑是可以根据实际需求进行自定义的。

希望本文对你理解如何在FastAPI中实现文件上传和处理功能有所帮助!

以上就是如何在FastAPI中实现文件上传和处理的详细内容,更多请关注Work网其它相关文章!

08-14 21:32