Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何返回字节数组,以便它在浏览器中作为zip文件下载?_Python_Python 3.x - Fatal编程技术网

Python 如何返回字节数组,以便它在浏览器中作为zip文件下载?

Python 如何返回字节数组,以便它在浏览器中作为zip文件下载?,python,python-3.x,Python,Python 3.x,我在S3中有一个zip文件,我正试图返回给用户。最终的结果是,当用户点击我的API时,它应该在用户的计算机上下载这个zip文件 下面是我从S3获取数据的方式(也可以使用S3.get_对象检索数据) 一旦我得到finalData,我就将标题设置为 request.response.content_type = 'binary/octet-stream' request.response.headers['Access-Control-Allow-Methods'] = 'POST, GET' re

我在S3中有一个zip文件,我正试图返回给用户。最终的结果是,当用户点击我的API时,它应该在用户的计算机上下载这个zip文件

下面是我从S3获取数据的方式(也可以使用S3.get_对象检索数据)

一旦我得到
finalData
,我就将标题设置为

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['Content-Transfer-Encoding']='binary'
request.response.headers['X-filename'] = path
request.response.content_disposition = 'attachment;filename=try.zip'
然后从我的API返回
finalData

文件被下载,但当我尝试打开它时,它显示:

有人知道为什么会这样吗?看来这对一个年轻人来说效果不错。我试图在API网关中实现这一点

我试图读取通过十六进制编辑器下载的文件,它显示了这一点

如果我执行
responseFinal.decode(encoding=“utf-8”,errors=“ignore”)
,现在下载的文件看起来是这样的(仍然没有解压缩)。 通过十六进制编辑器中的预签名url成功下载的文件如下所示。有没有我遗漏的编码?(我尝试过utf-8解码,但对zip文件来说失败了)

把它弄明白了。问题是金字塔中的渲染器正在将数据转换为字符串格式。如果我们将数据添加到响应中,渲染器不会影响它。感谢@user120242为我指明了方向。
我通过创建一个响应对象修复了它

async def func(request):
url = s3_client.generate_presigned_url('get_object',
                                           Params={'Bucket': DEFAULT_BUCKET_NAME,
                                                   'Key': path},
                                           ExpiresIn=3600)
    response = urllib.request.urlopen(url)
    finalData = response.read()
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['Content-Transfer-Encoding'] = 'binary'
    request.response.headers['X-filename'] = path
    request.response.content_disposition = 'attachment;filename=try.zip'

request.response.body = finalData
return request.response

无效zip文件的内容是什么?这可能给你一个暗示。尝试用十六进制编辑器打开它。嘿@orlp,zip文件包含一个.json文件和.csv文件。如果我通过预先指定的url下载(只需点击浏览器中的url),它将完美地下载文件。我实际上正在开发一个API,将这些数据返回给用户。你误解了我的评论。通过十六进制编辑器查看
try(1).zip
,查看它实际包含的内容,以获得错误的提示。@orlp用try(1).zip的内容以及它的预期外观更新了文章。这看起来像是二进制字符串的Python显示序列化表示,而不是实际的二进制数据。显示用于将其写入文件的代码。问题可能就在那里。看起来您获取了二进制数据并执行了
str(b“data”)
,这是错误的输出方式。
async def func(request):
url = s3_client.generate_presigned_url('get_object',
                                           Params={'Bucket': DEFAULT_BUCKET_NAME,
                                                   'Key': path},
                                           ExpiresIn=3600)
    response = urllib.request.urlopen(url)
    finalData = response.read()
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['Content-Transfer-Encoding'] = 'binary'
    request.response.headers['X-filename'] = path
    request.response.content_disposition = 'attachment;filename=try.zip'

request.response.body = finalData
return request.response