2013-11-23 2 views
1

나는이 모델 이름업로드 이미지 파일을 아마존 S3 장고

utils.py

def asset_upload(instance, filename): 
    ctype = ContentType.objects.get_for_model(instance) 
    model = ctype.model 
    app = ctype.app_label  

    if model == 'product': 
     # Assets for a Product 
     user_id = instance.user.fs_uid 
     product_id = instance.id 
     output = 'user%s/product%s/assets/%s' % (user_id, product_id, filename) 

    elif model == 'category': 
     # Assets for a Product 
     user_id = instance.user.fs_uid 
     product_id = instance.id 
     output = 'user%s/category%s/assets/%s' % (user_id, product_id, filename) 

    else: 
     raise NotImplementedError("Unsupported model for Image Upload") 

    return output 
에 따라 일부 폴더 구조를 만들어 로컬 폴더에 파일을 업로드 장고 모델

models.py

class Product(models.Model): 
    name = models.CharField(max_length = 36) 
    description = models.TextField(max_length = 2000) 
    created = models.DateTimeField(auto_now_add = True) 
    updated = models.DateTimeField(auto_now = True) 
    picture = models.ImageField(upload_to = utils.asset_upload, null = True, max_length = 250) 
    picture.allow_tags = True 

형태. 평

class ProductForm(ModelForm): 
    class Meta: 
     model = Product 
위의 코드에서 그래서

def product_creation(request): 
    product_form = ProductForm() 
    if request.method == 'POST': 
     product_form = ProductForm(request.POST,request.FILES) 
     if product_form.is_valid(): 
      obj = product_form.save(commit=False) 
      obj........ = .... 
      obj.save() 
      return redirect(reverse('product_detail', args=[obj.id])) 
    return render_to_response('products/product.html', 
            { 'product_form':product_form,}, 
            context_instance = RequestContext(request)) 

views.py, 지금

/media/user235/product269/assets/buscuits_butter.png 
/media/user235/product269/assets/choclate_pie.png 

처럼 media 폴더로 성공적으로 이미지를 업로드 할 수 그러나 내가 원하는 수 위의 이미지를 로컬 파일 시스템 대신 Amazon s3에 저장합니다.

그래서 인터넷 검색에 의해 난 다음 내가 이미지 아마존 S3에 저장됩니다 희망 (모든 자격 증명을 제공함으로써 그래서 위의 함수에서 난 콘텐츠와 함께 내 파일 경로를 보내는 경우 here

def store_in_s3(filename, content): 
    conn = S3Connection(settings.ACCESS_KEY, settings.PASS_KEY) 
    b = conn.create_bucket("bucket_name") 
    mime = mimetypes.guess_type(filename)[0] 
    k = Key(b) 
    k.key = filename 
    k.set_metadata("Content-Type", mime) 
    k.set_contents_from_string(content) 
    k.set_acl("public-read") 

같은 일부 코드를 발견)

그러나이 함수는 (일부 디렉토리 경로와 함께) 파일을 구현/전송하는 방법에 대해 confused입니다.

나는 모델에서 upload_to = None을 만들려고하지만, 또한
product: "picture": FileFields require an "upload_to" attribute. 

지금 우리가 아는 한, 로컬 폴더에 파일 저장 피하고, 아마존 버킷에 저장하려는 오류를

가 발생

그래서 사람이 할 수있는 제발 어떻게 hook/re arrange 내 위의 코드 파일 구조로 이미지를 업로드하려면 위의 모델 구조에 따라 생성 오전

답변

0

장고의 File Storage API especia를 한번보세요 lly는 S3 Storage입니다.

upload_to 키워드로 함수를 전달하지 않습니다. 상속 된 생성을 고려하여 ImageField을 작성하고 고유 한 이름 지정 방법을 작성할 수 있습니다.