首页 >后端开发 >Python教程 >如何使用'form-data”高效地将文件上传到FastAPI服务器?

如何使用'form-data”高效地将文件上传到FastAPI服务器?

Barbara Streisand
Barbara Streisand原创
2024-12-07 20:30:13474浏览

How to Efficiently Upload Files to a FastAPI Server Using `form-data`?

使用 form-data 和 SpooledTemporaryFile 使用 FastAPI 上传文件

要使用带有 multipart/form-data 的 FastAPI 上传文件,建议安装python-multipart 作为多部分文件通过发送form-data。

pip install python-multipart

这是使用 FastAPI 上传文件的改进示例:

from fastapi import File, UploadFile
from typing import List

@app.post("/upload")
def upload(file: UploadFile = File(...)):
    try:
        # Using file.file for synchronous operations (e.g., opening a file on disk)
        contents = file.file.read()
        with open(file.filename, 'wb') as f:
            f.write(contents)
    except Exception:
        return {"message": "An error occurred while uploading the file."}
    finally:
        file.file.close()

    return {"message": f"Successfully uploaded {file.filename}"}

如果您需要分块处理较大的文件,请考虑以较小的增量读取文件。您可以使用手动循环:

@app.post("/upload")
def upload(file: UploadFile = File(...)):
    try:
        with open(file.filename, 'wb') as f:
            while contents := file.file.read(1024 * 1024):
                f.write(contents)
    except Exception:
        return {"message": "An error occurred while uploading the file."}
    finally:
        file.file.close()

    return {"message": f"Successfully uploaded {file.filename}"}

或者使用 Shutil.copyfileobj() 方法,该方法以块的形式读取和写入数据:

from shutil import copyfileobj

@app.post("/upload")
def upload(file: UploadFile = File(...)):
    try:
        with open(file.filename, 'wb') as f:
            copyfileobj(file.file, f)
    except Exception:
        return {"message": "An error occurred while uploading the file."}
    finally:
        file.file.close()

    return {"message": f"Successfully uploaded {file.filename}"}

附加说明:

  • FastAPI 使用 SpooledTemporaryFile 作为文件upload,将数据存储在内存中。对于大于 1MB 的文件,数据将写入磁盘上的临时文件。
  • 如果使用 async def 定义端点,请使用此答案中提到的异步文件处理: [https://stackoverflow.com/a/69868184/6616846](https://stackoverflow.com/a/69868184/6616846)
  • 要上传多个文件,您可以使用 UploadFile 对象列表您的端点函数。
  • 有关 HTML 表单示例,请参阅原始版本中提供的链接回答。

以上是如何使用'form-data”高效地将文件上传到FastAPI服务器?的详细内容。更多信息请关注PHP中文网其他相关文章!

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