我有许多 XML 文件已添加到 S3(本地堆栈服务器)。我可以通过 Cyberduck 查看这些文件,它们是有效的 xml 文件。但是,当我下载对象时,XML 数据用双引号括起来,文档中的每个双引号都被排除,并且每行都有 。我已确保响应内容类型为“text/xml”。
s3 = boto3.client('s3',
config=s3_config,
endpoint_url=endpoint_url,
aws_access_key_id='foo',
aws_secret_access_key='bar',
)
try:
r = s3.get_object(Bucket=bucket, Key=key)
return Response(r['Body'].read().decode("utf-8"))
except Exception as e:
raise(e)
这会导致
的反应"
<rpc-reply xmlns:....">\n
<data>\n
<configuration>\n
<server>meanwhileinhell</server>\n
<security>\n
<group>\n
<name>mih-</name>\n
<system>\n
<scripts>\n
...
...
...
</configuration>\n
</data>\n
</rpc-reply>\n"
我似乎无法确保这是一个原始的 XML 响应正文,所有转义都已被删除。以下是我尝试过的一些其他实现:
from io import BytesIO
f = BytesIO()
s3.download_fileobj(bucket, key, f)
return Response(f.getvalue(), content_type="text/xml")
from xml.etree import ElementTree
tree = ElementTree.fromstring(r['Body'].read())
return Response(tree)
我也尝试过使用
pickle
和 BeautifulSoup
但没有进一步成功。我还没有尝试过使用其他类型的文件(例如 jpg),但为什么我无法从对象中获取实际的原始二进制数据?我正在下载的文件是 <50KB.
我通过使用 StreamingHttpResponse 并解码流来实现此目的。没有转义字符或用双引号引起来。
from django.http import StreamingHttpResponse
r = s3.get_object(Bucket=bucket, Key=key)
return StreamingHttpResponse(r['Body'].read().decode('utf-8'), content_type="text/xml")