AI编程助手
AI免费问答

FastAPI 实现文件上传与数据传递

DDD   2025-08-01 20:02   806浏览 原创

fastapi 实现文件上传与数据传递

本文介绍了如何在 FastAPI 框架中实现文件上传,并同时接收其他数据。通过结合 UploadFile 类型和请求参数,可以轻松构建支持文件上传和数据传递的 API 接口,解决在处理复杂业务场景时,需要同时上传文件和传递相关元数据的需求。

FastAPI 提供了强大的文件上传功能,结合请求参数,可以方便地实现文件上传和数据传递。以下是如何在 FastAPI 中实现这一功能的详细步骤和示例。

实现方法

FastAPI 使用 UploadFile 类型来处理文件上传。你可以将 UploadFile 作为函数参数,并结合其他参数来接收额外的数据。

示例代码

from fastapi import FastAPI, UploadFile, File

app = FastAPI()


@app.post("/upload")
async def upload_file(
    file: UploadFile = File(...), transaction_id: str = None, organization_id: str = None
):
    """
    上传文件并接收 transaction_id 和 organization_id。
    """
    file_name = f"{organization_id}_{transaction_id}_{file.filename}"  # 拼接文件名,包含原始文件名
    try:
        contents = await file.read() # 使用 await 读取文件内容
        with open(file_name, "wb") as f:
            f.write(contents)
    except Exception as e:
        return {"message": f"There was an error uploading the file: {e}"}
    finally:
        await file.close() # 使用 await 关闭文件

    return {"filename": file_name, "message": "File uploaded successfully"}

代码解释

  1. 导入必要的模块: 导入 FastAPI, UploadFile 和 File。File 用于显式声明参数为文件上传。
  2. 定义路由: 使用 @app.post("/upload") 定义一个 POST 请求的路由。
  3. 定义函数参数:
    • file: UploadFile = File(...): 声明 file 参数为 UploadFile 类型,File(...) 表示这是一个文件上传字段,且为必填项。省略号 ... 表示该参数是必需的。
    • transaction_id: str = None: 声明 transaction_id 参数为字符串类型,默认为 None。
    • organization_id: str = None: 声明 organization_id 参数为字符串类型,默认为 None。
  4. 读取文件内容: 使用 await file.read() 异步读取上传文件的内容。 file.file.read() 已经被弃用,推荐使用 await file.read()。
  5. 保存文件: 使用 open(file_name, "wb") 打开一个文件,并将读取到的文件内容写入。wb 模式表示以二进制写入模式打开文件。
  6. 关闭文件: 使用 await file.close() 异步关闭文件。 确保文件资源被正确释放。
  7. 返回结果: 返回一个包含文件名和成功消息的 JSON 响应。

注意事项

  • 文件大小限制: FastAPI 默认没有文件大小限制。如果需要限制文件大小,可以使用中间件或者在路由函数中进行检查。
  • 文件类型验证: 可以根据 file.content_type 属性来验证文件类型,确保上传的文件符合预期。
  • 异常处理: 在处理文件上传时,需要考虑各种异常情况,例如文件读取失败、文件写入失败等。可以使用 try...except 块来捕获并处理这些异常。
  • 异步操作: 文件上传通常是 I/O 密集型操作,建议使用异步函数来处理,以避免阻塞主线程。
  • 文件名安全: 上面的示例直接使用了用户上传的文件名,存在安全风险。在实际应用中,应该对文件名进行处理,例如生成唯一的文件名,以防止恶意用户上传包含恶意代码的文件。
  • 使用 await 关键字: 在读取和关闭文件时,使用了 await 关键字,这是因为 file.read() 和 file.close() 是异步函数,需要使用 await 来等待它们完成。

总结

通过结合 UploadFile 类型和请求参数,可以轻松实现 FastAPI 中的文件上传和数据传递。在实际应用中,需要注意文件大小限制、文件类型验证、异常处理和文件名安全等问题。使用异步函数可以提高应用的性能。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。