Django存储Boto Bad Digest

时间:2016-08-05 20:15:36

标签: python django python-3.x amazon-s3 django-storage

我在Python 3上通过django-storages boto存储使用S3文件存储。当我尝试上传文件时,我收到此错误:

boto.exception.S3ResponseError: S3ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>BadDigest</Code>
<Message>The Content-MD5 you specified did not match what we received.</Message>
...

我想保存的文件是一个随请求下载的文件。它的要点是:

import requests
from django.core.files.base import ContentFile

response = requests.get("http://example.com/some_file.pdf")
document_contents = ContentFile(response.text)
my_model.save("filename", document_contents)

我做错了什么?

2 个答案:

答案 0 :(得分:0)

请参阅此相关的boto问题:https://github.com/boto/boto/issues/2868

Boto在Python3中的字符串编码存在一些问题。如果您知道编码,则使用response.content代替response.text可解决问题:

document_contents = ContentFile(response.content)

答案 1 :(得分:0)

我遇到了类似的问题。

我改为boto3,存储引擎改为。

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

最后,我还必须使用.encode将内容转换为二进制文件(&#39; utf-8&#39;)

my_model.save("filename", document_contents.encode('uft-8'))