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