Django:允许从S3下载各种媒体文件而无需创建模型(同时隐藏s3存储)

时间:2014-04-09 10:55:36

标签: python django amazon-s3 gzip boto

我在S3中有数千个媒体文件。

  • 文件可以是mimetype plain_text,html,xml,pdf,binary,zip等。
  • 此外,某些文件也可能是gzip压缩

我想在DJango应用中呈现这些文件。我不想提供用户直接访问S3。在某些情况下,我想在渲染之前修改文件 例如:

  • /base/path/file_name_aaa.txt.gz< ---从S3下载,解压缩并通过django呈现预先格式化的文本
  • /base/path/file_name_aaa.pdf< ---从S3下载并通过django呈现为PDF
  • /base/path/file_name_bbb.pdf.gz< ---从S3下载,通过django解压缩并呈现为PDF
  • /base/path/file_name_ccc.xml.gz< ---从S3下载,解压缩,替换一些内容,并渲染为解压缩的xml通过django

我得到了纯文本的第一部分:

from boto.s3.connection import S3Connection
import zlib

def get_gzipped_content(stream):
    content = ''
    for part in stream_decompress(stream):
        content += part
    return content

def stream_decompress(stream):
    '''
    decompress s3 gzipped stream
    http://stackoverflow.com/questions/12571913/python-unzipping-stream-of-bytes
    '''
    dec = zlib.decompressobj(16+zlib.MAX_WBITS)  # same as gzip module
    for chunk in stream:
        rv = dec.decompress(chunk)
        if rv:
            yield rv
conn = S3Connection(aws_key, aws_secret)
fname = 'aaa/bbb/ccc_1234.txt.gz'
key = conn.get_bucket('my_bucket').get_key(fname)
if fname.lower().endswith('.gz'):
    content = get_gzipped_content(key)
else:
    content = key.get_contents_as_string()
(render content as string in django)

我很感激获得其他mime类型/ gzip的帮助

2 个答案:

答案 0 :(得分:2)

除了kubus添加的内容之外,我还试图弄清楚如何强制"渲染"在浏览器vs"下载"文件。

response = HttpResponse(ContentFile(content), content_type=mimetypes.guess_type(attach_id)[0])
if <this file should be forced download, and not render in browser>:
    response['Content-Disposition'] = "attachment; filename=%s" % filename 
# else, it will try to render in browser.

答案 1 :(得分:1)

您可以使用标准的mimetype模块来确定内容类型和文件名编码,例如:

In [1]: import mimetypes

In [2]: mimetypes.guess_type('hello.txt.gz')
Out[2]: ('text/plain', 'gzip')

In [3]: mimetypes.guess_type('hello.pdf.gz')
Out[3]: ('application/pdf', 'gzip')

In [4]: mimetypes.guess_type('hello.pdf')
Out[4]: ('application/pdf', None)

https://docs.python.org/2/library/mimetypes.html