0

有没有办法通过 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).

4

2 回答 2

0

经过更多的故障排除后,我找到了一种方法来做到这一点。

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),没有额外的参数,也没有原始字节对象的额外格式。

于 2020-09-14T12:59:50.183 回答
0

据我所知,您需要设置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原始字节和mimePythonMagick 给出的数据类型。

于 2020-09-14T12:23:06.737 回答