如何在API响应Python 3.6.5中从S3返回zip文件?

如何在API响应Python 3.6.5中从S3返回zip文件?,python,python-3.x,boto3,Python,Python 3.x,Boto3,我是python新手,我曾试图构建一个API来模拟AWS预签名URL的工作方式。我已经创建了一个点击我们的端点的自定义url,解析该url后,它应该返回与该url关联的数据。数据是S3上存在的zip文件。我试着用aiboto3来获取数据 async with aioboto3.client("s3", config=Config(signature_version='s3v4'), aws_access_key_id=AWS_ACCESS_KEY, aws_secr

我是python新手,我曾试图构建一个API来模拟AWS预签名URL的工作方式。我已经创建了一个点击我们的端点的自定义url,解析该url后,它应该返回与该url关联的数据。数据是S3上存在的zip文件。我试着用aiboto3来获取数据

 async with aioboto3.client("s3", config=Config(signature_version='s3v4'), aws_access_key_id=AWS_ACCESS_KEY,
    aws_secret_access_key=AWS_SECRET_KEY,) as s3_client:
        try:
            s3_ob = await s3_client.get_object(Bucket=DEFAULT_BUCKET_NAME, Key=path)
然而,这一步失败了,因为它给出了一个

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 12: invalid continuation byte 
这是可以理解的,因为zip可能不是utf-8编码的。 因此,我继续使用boto3并简单地获得如下对象数据

s3_file = s3_client.get_object(Bucket=DEFAULT_BUCKET_NAME, Key=path)
response = s3_file["Body"].read() 
响应是一个字节数组,包含如下数据

b'PK\x03\x04\x14\x00\x00\x00\x08\x00\x10\x08... 
如果我想让用户端在浏览器中点击此url时自动下载此zip文件,那么如何从API返回此数据?现在它确实被下载了,因为我已经设置了以下内容,但是我无法打开它,因为它显示不支持的格式

(将其设置为自动触发下载)


此API正在Frontdoor(API网关)中编写。返回此数据的函数是一个异步函数。这段代码适用于csv文件,我只返回response.decode('utf-8'),但是在这种情况下我不能这样做,因为解码它会产生错误。我尝试使用
latin1
作为zip文件数据的解码,但是它会弄乱数据,下载的文件显示不支持格式。

您是否使用任何python框架来提供该api?@MahendraSinghMeena我们使用的是金字塔框架您可以使用FileResponse(),为此,您需要将文件保存在金字塔服务器上的某个位置,然后它将返回到使用您的api的客户端。您是否使用任何python框架来服务该api?@MahendraSinghMeena我们使用的是金字塔框架您可以使用FileResponse(),为此,您需要将文件保存在金字塔服务器上的某个位置,然后它将返回到使用您的api的客户端。
request.response.content_type = 'binary/octet-stream'
            request.response.headers['Access-Control-Allow-Methods'] = 'POST, GET'
            request.response.headers['Access-Control-Expose-Headers'] = 'X-filename'
            request.response.headers['X-filename'] = path
            request.response.content_disposition = 'attachment;filename=hello.zip'