我有一个简单的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/

10-11 08:37