admin管理员组

文章数量:1794759

FastAPI后台开发基础(12): UploadFile的使用

示例代码

代码语言:python代码运行次数:0运行复制
@app.post("/files/")
async def create_file(file: Annotated[bytes, File()]):
    """
    优势:
        简单直接:直接以字节形式接收文件,适用于处理小文件,因为它们可以直接加载到内存中。
    劣势:
        内存消耗:对于大文件,将整个文件内容加载到内存中可能会导致显著的内存消耗。
    """
    return {"file_size": len(file)}


@app.post("/uploadfile/")
async def create_upload_file(file: Annotated[UploadFile, File(...)]):
    """
    curl -X 'POST' 'http://127.0.0.1:18081/uploadfile/' -H 'accept: application/json' -H 'Content-Type: multipart/form-data' \
    -F 'file=@test.mp4;type=application/octet-stream'

    优势:
        内存效率:UploadFile 使用了“磁盘存储”,对于大文件,它不会将所有内容一次性加载到内存中,而是将文件存储在磁盘上的临时位置,这有助于减少内存消耗
        更多功能:UploadFile 提供了一些额外的方法和属性,如 save()、read()、write()、filename、content_type 等,这些可以帮助你更灵活地处理上传的文件
    劣势:
        稍微复杂:与直接使用字节数据相比,使用 UploadFile 需要更多的代码来处理文件(例如,读取、保存等操作)
    """
    h_sha256 = hashlib.sha256()  # 计算 SHA256
    h_sha3_512 = hashlib.sha3_512()  # 计算 SHA3-512
    h_sha512 = hashlib.sha512()  # 计算 SHA512
    read_data_count = 0  # 已读取的文件字节数

    ret = {"filename": file.filename,
           'content_type': file.content_type,
           'size_in_Byte': f'{file.size}Bytes',
           'size_in_KB': f'{file.size / 1024}KBs',
           'size_in_MB': f'{file.size / 1024 / 1024}MBs',
           'size_in_GB': f'{file.size / 1024 / 1024 / 1024}GBs',
           }
    print(ret)

    def update_hash(data: bytes):
        h_sha256.update(data)
        h_sha3_512.update(data)
        h_sha512.update(data)

    loop = asyncio.get_running_loop()
    # 以块的方式写入文件,适用于大文件
    while read_data_count < file.size:
        content = await file.read(1024 * 1024 * 5)  # 每次读取5MB
        read_data_count += len(content)
        await loop.run_in_executor(None, update_hash, content)
        if read_data_count >= file.size:
            break
    ret[h_sha256.name] = h_sha256.hexdigest()
    ret[h_sha512.name] = h_sha512.hexdigest()
    ret[h_sha3_512.name] = h_sha3_512.hexdigest()
    return ret
使用 File 上传文件
使用 UploadFile 上传文件

本文标签: FastAPI后台开发基础(12) UploadFile的使用