图片上传:iPhone客户端 - Django - S3

时间:2012-02-17 21:27:17

标签: python django amazon-s3 amazon-web-services

我有一个关于从客户端(在这种情况下是iPhone应用程序)上传到S3的一般问题。我正在使用Django在EC2实例上编写我的web服务。以下方法是将文件上传到S3的最低限度,它适用于较小的文件(jpgs或pngs <1 MB):

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的Python&amp;中的章节。 AWS Cookbook,但由于它只是代码示例,它并没有真正回答我的问题。

2 个答案:

答案 0 :(得分:1)

你可能想看看django-storages。它有助于在S3和一堆其他服务/平台上存储文件。

答案 1 :(得分:1)

Django将小型上传文件存储在内存中。超过一定的大小,它会将它存储在磁盘上的临时文件中。

是的,分块也有助于节省内存:

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

所有这些操作都是同步的,因此Django会等到文件完全上传后再尝试将其存储在S3中。 S3必须在它返回之前完成上传,因此您可以保证在收到HttpResponse()

之前它将通过Django上传到S3

Django的File Uploads文档提供了很多有关如何处理各种上传情况的精彩信息。