我有一个关于从客户端(在这种情况下是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!")
我对这一切都很陌生,所以我仍然不明白这里发生了什么。是这样的情况:
所以一般来说,我想知道我的代码的一行是否会在另一行之后执行。例如。什么时候会return HttpResponse("Uploading raw data to S3 ...")
开火?文件仍在上传或成功上传后?
感谢您的帮助。另外,对于任何对待这个主题的文档,我将不胜感激。我看了一下O'Reilly的Python&amp;中的章节。 AWS Cookbook,但由于它只是代码示例,它并没有真正回答我的问题。
答案 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上传到S3Django的File Uploads文档提供了很多有关如何处理各种上传情况的精彩信息。