Загрузка и архивирование файлов из Amazon - PullRequest
3 голосов
/ 29 февраля 2012

В настоящее время я храню все свои фотографии на amazon s3 и использую django для своего сайта.Я хочу, чтобы у меня была кнопка, которая позволяла бы пользователям щелкать по ней, чтобы все их фотографии были заархивированы и возвращены к ним.

В настоящее время я использую boto для взаимодействия с amazon и обнаружил, что могу пройти всю корзинуlist / use get_key для поиска определенных файлов и загрузки их

После этого мне нужно будет временно сохранить их, затем сжать и вернуть.

Каков наилучший способ сделать это?

Спасибо

Ответы [ 2 ]

1 голос
/ 23 мая 2014

Используя python-zipstream в соответствии с этим запросом на получение , вы можете сделать что-то вроде этого:

import boto
import io
import zipstream
import sys


def iterable_to_stream(iterable, buffer_size=io.DEFAULT_BUFFER_SIZE):
    """
    Lets you use an iterable (e.g. a generator) that yields bytestrings as a
    read-only input stream.

    The stream implements Python 3's newer I/O API (available in Python 2's io
    module).  For efficiency, the stream is buffered.

    From: https://stackoverflow.com/a/20260030/729491
    """
    class IterStream(io.RawIOBase):
        def __init__(self):
            self.leftover = None

        def readable(self):
            return True

        def readinto(self, b):
            try:
                l = len(b)  # We're supposed to return at most this much
                chunk = self.leftover or next(iterable)
                output, self.leftover = chunk[:l], chunk[l:]
                b[:len(output)] = output
                return len(output)
            except StopIteration:
                return 0    # indicate EOF
    return io.BufferedReader(IterStream(), buffer_size=buffer_size)


def iterate_key():
    b = boto.connect_s3().get_bucket('lastage')
    key = b.get_key('README.markdown')
    for b in key:
        yield b

with open('/tmp/foo.zip', 'w') as f:
    z = zipstream.ZipFile(mode='w')
    z.write(iterable_to_stream(iterate_key()), arcname='foo1')
    z.write(iterable_to_stream(iterate_key()), arcname='foo2')
    z.write(iterable_to_stream(iterate_key()), arcname='foo3')
    for chunk in z:
        print "CHUNK", len(chunk)
        f.write(chunk)

В основном мы перебираем содержимое ключа, используя boto, конвертируем этот итератор в поток, используя метод iterable_to_stream из этот ответ , а затем python-zipstream создаем zip-файл на лету.

1 голос
/ 29 февраля 2012

Вы можете взглянуть на этот вопрос или на этот фрагмент , чтобы загрузить файл

# This is not a full working example, just a starting point
# for downloading images in different formats.

import subprocess
import Image

def image_as_png_pdf(request):
  output_format = request.GET.get('format')
  im = Image.open(path_to_image) # any Image object should work
  if output_format == 'png':
    response = HttpResponse(mimetype='image/png')
    response['Content-Disposition'] = 'attachment; filename=%s.png' % filename
    im.save(response, 'png') # will call response.write()
  else:
    # Temporary disk space, server process needs write access
    tmp_path = '/tmp/'
    # Full path to ImageMagick convert binary
    convert_bin = '/usr/bin/convert' 
    im.save(tmp_path+filename+'.png', 'png')
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=%s.pdf' % filename
    ret = subprocess.Popen([ convert_bin, 
                            "%s%s.png"%(tmp_path,filename), "pdf:-" ],
                            stdout=subprocess.PIPE)
    response.write(ret.stdout.read())
  return response

для создания zip перейдите по ссылке , которую я вам дал , вы также можете использовать zipimport, как показано здесь примеры приведены внизу страницы, следуйте документации для более новых версий

Вас также может заинтересовать этот , хотя он был создан для django 1.2, он может не работать на 1.3

...