2012-02-17 2 views
3

클라이언트 (이 경우 iPhone 앱)에서 S3으로 업로드하는 것과 관련하여 일반적인 질문이 있습니다. 장고를 사용하여 EC2 인스턴스에서 내 웹 서비스를 작성합니다. 다음 방법은 S3에 파일을 업로드 할 수있는 최소한이며 작은 파일 (JPG를 또는 PNG 파일 < 1메가바이트)와 아주 잘 작동 :이미지 업로드 : iPhone 클라이언트 - Django - S3

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 & AWS Cookbook에서 챕터를 살펴 봤지만 코드 예제 일 뿐이므로 실제로는 내 질문에 답하지 않습니다.

답변

1

장고는 작은 업로드 파일을 메모리에 저장합니다. 특정 크기를 초과하면 디스크의 임시 파일에 저장됩니다.

예, 청크뿐만 아니라 메모리 절약에 도움이됩니다 :

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

이러한 작업의 모든

동기이며, 장고는 S3에 저장하려고 시도하기 전에 파일이 완전히 업로드 될 때까지 기다리 있도록. S3가 반환되기 전에 업로드를 완료해야하므로 HttpResponse()를 받기 전에 Django와 S3를 통해 업로드된다는 보장을받습니다.

Django의 File Uploads 문서에 대한 많은 훌륭한 정보가 있습니다. 다양한 업로드 상황을 처리하는 방법.

+0

감사합니다. 정말 도움이됩니다. 방금 다른 게시물 몇 개를 확인한 결과 클라이언트 (iPhone)의 콘텐츠를 S3에 직접 업로드하는 것이 가장 좋은 해결책 인 것처럼 보입니다. 이렇게하면 서버가 바로 연결되며 트래픽을 두 배로 늘릴 수 있습니다 (예 : EC2/Django에 처음 업로드 한 다음 S3에 업로드). –

+1

업로드 한 이미지를 처리하는 경우에만주의해야합니다. 내 사업에서 각 이미지는 Django 서버에서 다양한 크기로 크기가 조정 된 다음 각 이미지가 CDN에 업로드됩니다. 단지 예일 뿐이므로 자신의 앱을 염두에 두어야합니다. – Jordan

+0

알겠습니다. 따라서 서버에서 이미지 처리를 수행하지 않으면 클라이언트 -> S3로 직접 이동할 수 있습니다. 처리가 필요한 경우 Django 서버를 통해 이동합니다. 다시 한 번 고마워, 이것은 정말로 도움이되었다. –

1

장고 보관소를보고 싶을 수도 있습니다. S3 및 다른 서비스/플랫폼에 파일을 저장하는 것을 용이하게합니다.

+0

감사합니다. 방금 다른 게시물을 확인한 결과 장고를 거치지 않고 클라이언트 (iPhone)에서 S3로 직접 업로드해야하는 것처럼 보입니다. 이 경우에는 장고 저장 장치가 필요하지 않습니다. 하지만 알려 줘서 고마워. –