Python 通过Flask&;显示来自S3的文件(图像);拜特西奥

Python 通过Flask&;显示来自S3的文件(图像);拜特西奥,python,flask,boto3,bytesio,Python,Flask,Boto3,Bytesio,我正试图使用Boto3将一个文件从AWS S3直接拉入一个BytesIO对象。这最终将用于操作下载的数据,但现在我只是尝试通过Flask将该文件直接提供给用户。正如我所理解的,下面的所有内容都应该起作用,但不是。浏览器只是不显示任何内容(只显示下载的几个字节的数据) (在本例中,我的示例文件是png) 这几天我一直在绕圈子,很明显我错过了什么,我不知道是什么。脚本正在Python 3.8 docker容器中运行,其中包含boto3/flask/等的最新副本。倒带字节IO对象应该可以完成此任务,使

我正试图使用Boto3将一个文件从AWS S3直接拉入一个BytesIO对象。这最终将用于操作下载的数据,但现在我只是尝试通过Flask将该文件直接提供给用户。正如我所理解的,下面的所有内容都应该起作用,但不是。浏览器只是不显示任何内容(只显示下载的几个字节的数据)

(在本例中,我的示例文件是png)


这几天我一直在绕圈子,很明显我错过了什么,我不知道是什么。脚本正在Python 3.8 docker容器中运行,其中包含boto3/flask/等的最新副本。

倒带
字节IO
对象应该可以完成此任务,使用
文件。seek(0)
就在
发送文件(…)
之前

作为记录,我不确定您的boto3/botocore调用是否是“最佳实践”,为了尝试您的用例,我最终得出以下结论:

from boto3.session import Session

session = Session(
    aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY, region_name=REGION_NAME
)
s3 = session.resource("s3")


@base_bp.route("/test-stuff")
def test_stuff():
    a_file = io.BytesIO()
    s3_object = s3.Object(BUCKET, PATH)
    s3_object.download_fileobj(a_file)
    a_file.seek(0)
    return send_file(a_file, mimetype=s3_object.content_type)
它在从磁盘读取文件时工作,因为您将
BytesIO
与文件的全部内容进行实例化,因此它已正确执行,并且仍然处于“位置0”。

是的。那个
对象。seek(0)
就是它。谢谢你的解释!
def catch_all(path):
    s3 = boto3.client('s3', aws_access_key_id=AWS_ACCESS_KEY, aws_secret_access_key=AWS_SECRET_KEY,)
    file = io.BytesIO()
    metadata = s3.head_object(Bucket=S3_BUCKET, Key=path)
    conf = boto3.s3.transfer.TransferConfig(use_threads=False)
    s3.download_fileobj(S3_BUCKET, path, file)
    print(file.getvalue())
    fh = open("/tmp/test1.png","wb")
    fh.write(file.getvalue())
    fh.close()
    fh = open("/tmp/test1.png","rb")
    f2 = io.BytesIO(fh.read())
    fh.close
    print(f2.getvalue())
    return send_file(f2, mimetype=metadata['ContentType'])
from boto3.session import Session

session = Session(
    aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY, region_name=REGION_NAME
)
s3 = session.resource("s3")


@base_bp.route("/test-stuff")
def test_stuff():
    a_file = io.BytesIO()
    s3_object = s3.Object(BUCKET, PATH)
    s3_object.download_fileobj(a_file)
    a_file.seek(0)
    return send_file(a_file, mimetype=s3_object.content_type)