FastAPI:如何通过API下载字节
FastAPI: How to download bytes through the API
有没有办法通过FastAPI下载文件?我们想要的文件位于 Azure Datalake 中,从数据湖中检索它们不是问题,当我们尝试将从数据湖中获取的字节传输到本地计算机时,就会出现问题。
我们尝试在 FastAPI 中使用不同的模块,例如 starlette.responses.FileResponse
和 fastapi.Response
,但没有成功。
在 Flask 中这不是问题,可以通过以下方式完成:
from io import BytesIO
from flask import Flask
from werkzeug import FileWrapper
flask_app = Flask(__name__)
@flask_app.route('/downloadfile/<file_name>', methods=['GET'])
def get_the_file(file_name: str):
the_file = FileWrapper(BytesIO(download_file_from_directory(file_name)))
if the_file:
return Response(the_file, mimetype=file_name, direct_passthrough=True)
当 运行 此文件具有有效的文件名时,文件会自动下载。 FastAPI 中是否有与此等效的方法?
已解决
经过更多的故障排除后,我找到了执行此操作的方法。
from fastapi import APIRouter, Response
router = APIRouter()
@router.get('/downloadfile/{file_name}', tags=['getSkynetDL'])
async def get_the_file(file_name: str):
# the_file object is raw bytes
the_file = download_file_from_directory(file_name)
if the_file:
return Response(the_file)
因此,经过大量的故障排除和数小时的文档查看后,这就是全部,只需将字节返回为 Response(the_file)
。
据我所知,您需要将 media_type
设置为合适的类型。一年前我用一些代码做到了这一点,它运行良好。
@app.get("/img/{name}")
def read(name: str, access_token_cookie: str=Cookie(None)):
r = internal.get_data(name)
if r is None:
return RedirectResponse(url="/static/default.png")
else:
return Response(content=r["data"], media_type=r["mime"])
r
是一个字典,其中 data
作为原始字节,mime
是 PythonMagick 给出的数据类型。
经过更多的故障排除后,我找到了执行此操作的方法。
from fastapi import APIRouter, Response
router = APIRouter()
@router.get('/downloadfile/{file_name}', tags=['getSkynetDL'])
async def get_the_file(file_name: str):
# the_file object is raw bytes
the_file = download_file_from_directory(file_name)
if the_file:
return Response(the_file)
因此,经过大量的故障排除和数小时的文档查看后,这就是全部,只需将字节返回为 Response(the_file)
,没有额外的参数,也没有对原始字节对象进行额外的格式设置。
有没有办法通过FastAPI下载文件?我们想要的文件位于 Azure Datalake 中,从数据湖中检索它们不是问题,当我们尝试将从数据湖中获取的字节传输到本地计算机时,就会出现问题。
我们尝试在 FastAPI 中使用不同的模块,例如 starlette.responses.FileResponse
和 fastapi.Response
,但没有成功。
在 Flask 中这不是问题,可以通过以下方式完成:
from io import BytesIO
from flask import Flask
from werkzeug import FileWrapper
flask_app = Flask(__name__)
@flask_app.route('/downloadfile/<file_name>', methods=['GET'])
def get_the_file(file_name: str):
the_file = FileWrapper(BytesIO(download_file_from_directory(file_name)))
if the_file:
return Response(the_file, mimetype=file_name, direct_passthrough=True)
当 运行 此文件具有有效的文件名时,文件会自动下载。 FastAPI 中是否有与此等效的方法?
已解决
经过更多的故障排除后,我找到了执行此操作的方法。
from fastapi import APIRouter, Response
router = APIRouter()
@router.get('/downloadfile/{file_name}', tags=['getSkynetDL'])
async def get_the_file(file_name: str):
# the_file object is raw bytes
the_file = download_file_from_directory(file_name)
if the_file:
return Response(the_file)
因此,经过大量的故障排除和数小时的文档查看后,这就是全部,只需将字节返回为 Response(the_file)
。
据我所知,您需要将 media_type
设置为合适的类型。一年前我用一些代码做到了这一点,它运行良好。
@app.get("/img/{name}")
def read(name: str, access_token_cookie: str=Cookie(None)):
r = internal.get_data(name)
if r is None:
return RedirectResponse(url="/static/default.png")
else:
return Response(content=r["data"], media_type=r["mime"])
r
是一个字典,其中 data
作为原始字节,mime
是 PythonMagick 给出的数据类型。
经过更多的故障排除后,我找到了执行此操作的方法。
from fastapi import APIRouter, Response
router = APIRouter()
@router.get('/downloadfile/{file_name}', tags=['getSkynetDL'])
async def get_the_file(file_name: str):
# the_file object is raw bytes
the_file = download_file_from_directory(file_name)
if the_file:
return Response(the_file)
因此,经过大量的故障排除和数小时的文档查看后,这就是全部,只需将字节返回为 Response(the_file)
,没有额外的参数,也没有对原始字节对象进行额外的格式设置。