@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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。