我有一个简单的django视图,用于从amazon s3下载文件。
通过在本地保存文件进行测试是正确的:
def some_view(request):
res = s3.get_object(...)
try:
s3_file_content = res['Body'].read()
with open("/Users/yanik/ololo.jpg", 'wb') as f:
f.write(s3_file_content)
# file saved and I can view it
except:
pass
当切换到
StreamingHttpResponse
时,我得到了错误的文件格式(无法打开)甚至错误的大小(如果原始图像是317kb图像,则输出木材大约为620kb)def some_view(request):
res = s3.get_object(...)
response = StreamingHttpResponse(res['Body'].read(), content_type=res['ContentType'])
response['Content-Disposition'] = 'attachment;filename=' + 'ololo.jpg'
response['ContentLength'] = res['ContentLength']
return response
尝试了很多不同的设置,但到目前为止没有什么对我有用。输出文件已损坏。
更新
我设法得到了更多的初次亮相的信息。如果我将第一个示例中的文件写入方法从
'wb'
模式更改为'w'
模式,我将具有与StreamingHttpResponse
相同的输出(第一个视图将生成相同的断开文件)。所以看起来我必须告诉http头我的输出是
binary
格式的更新(找到问题的核心)
现在我明白了这个问题。但仍然没有解决办法。
res['Body'].read()
返回bytes
类型,StreamingHttpResponse
遍历这些字节,返回字节码。所以我的输入字节强制转换成数组,然后像连接字符串一样下载。截图:http://take.ms/JQztk如您所见,列表元素在最后。
StreamingHttpResponse.make_bytes
"""Turn a value into a bytestring encoded in the output charset."""
最佳答案
仍然不知道发生了什么。但是,https://stackoverflow.com/a/8601118/2576817中的FileWrapper
对boto3StreamingBody
反应型有效。
欢迎有人有勇气解释这种模糊的行为。
关于python - Django StreamingHttpResponse格式错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35647476/