Загрузка изображения: iPhone Client - Django - S3 - PullRequest
3 голосов
/ 18 февраля 2012

У меня есть общий вопрос относительно загрузки с клиента (в данном случае iPhone-приложения) на S3.Я использую Django для написания своего веб-сервиса на экземпляре EC2.Следующий метод является минимальным для загрузки файла на S3, и он очень хорошо работает с небольшими файлами (jpgs или pngs <1 МБ): </p>

def store_in_s3(filename, content):
    conn = S3Connection(settings.ACCESS_KEY, settings.PASS_KEY) # gets access key and pass key from settings.py
    bucket = conn.create_bucket('somebucket')
    k = Key(bucket) # create key on this bucket
    k.key = filename
    mime = mimetypes.guess_type(filename)[0]
    k.set_metadata('Content-Type', mime)
    k.set_contents_from_string(content)
    k.set_acl('public-read')

def uploadimage(request, name):
    if request.method == 'PUT':
        store_in_s3(name,request.raw_post_data)
        return HttpResponse("Uploading raw data to S3 ...")
    else:
        return HttpResponse("Upload not successful!")

Я довольно новичок во всем этом, поэтомуЯ до сих пор не понимаю, что здесь происходит.Это тот случай, когда:

  • Django получает файл и сохраняет его в памяти моего экземпляра EC2?
  • Следует ли мне избегать использования raw_post_data, а делать куски, чтобы избежать проблем с памятью?
  • Как только Django получит файл, передаст ли он функции store_in_s3?
  • Как узнать, была ли загрузка на S3 успешной?

В общем, мне интересно, будет ли одна строка моего кода выполняться за другой.Например, когда будет return HttpResponse("Uploading raw data to S3 ...") огонь?Пока файл все еще загружается или после того, как он был успешно загружен?

Спасибо за вашу помощь.Кроме того, я был бы благодарен за любые документы, которые рассматривают эту тему.Я взглянул на главы в O'Reilly's Python & AWS Cookbook, но поскольку это всего лишь примеры кода, он не отвечает на мои вопросы.

Ответы [ 2 ]

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

Django хранит небольшие загруженные файлы в памяти.Более определенного размера, и он будет хранить его во временном файле на диске.

Да, разбиение на блоки полезно и для экономии памяти:

for file_chunk in uploaded_file.chunks():
    saved_file.write(file_chunk)

Все эти операции являются синхронными,поэтому Django будет ждать полной загрузки файла, прежде чем попытается сохранить его на S3.S3 должен будет завершить загрузку, прежде чем он вернется, поэтому вы гарантированно загрузите его через Django и на S3, прежде чем получите HttpResponse ()

Django File Uploads в документации много полезной информации о том, как обрабатывать различные ситуации загрузки.

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

Возможно, вы захотите посмотреть на django-хранилища.Это облегчает хранение файлов на S3 и куче других сервисов / платформ.

...