2010-08-05 6 views
6

का उपयोग कर डीजेगो में अमेज़ॅन एस 3 में टाइपर इरर अपलोड करने वाली छवि फ़ाइल मैं प्रोग्रामिंग और डैंजो के लिए कुल शुरुआत करने वाला हूं इसलिए मैं मदद की सराहना करता हूं कि शुरुआत करने वाला अपना सिर गोल कर सकता है!बीओटीओ लाइब्रेरी

मैं बोटो लाइब्रेरी के साथ एक अमेज़ॅन एस 3 खाते में छवियों को अपलोड करने का तरीका दिखाने के लिए एक ट्यूटोरियल का अनुसरण कर रहा था, लेकिन मुझे लगता है कि यह Django के पुराने संस्करण के लिए है (मैं 1.1.2 और पायथन 2.65 पर हूं) और कुछ है बदला हुआ।

'InMemoryUploadedFile' वस्तु unsubscriptable है मेरे कोड है:: अपवाद प्रकार: लेखन त्रुटि अपवाद मान मैं कोई त्रुटि मिलती है

Models.py:

from django.db import models 
from django.contrib.auth.models import User 
from django import forms 
from datetime import datetime 

class PhotoUrl(models.Model): 
    url = models.CharField(max_length=128) 
    uploaded = models.DateTimeField() 
    def save(self): 
     self.uploaded = datetime.now() 
     models.Model.save(self) 

views.py:

import mimetypes 
from django.http import HttpResponseRedirect 
from django.shortcuts import render_to_response 
from django.core.urlresolvers import reverse 
from django import forms 
from django.conf import settings 
from boto.s3.connection import S3Connection 
from boto.s3.key import Key 

def awsdemo(request): 
def store_in_s3(filename, content): 
    conn = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY) 
    b = conn.create_bucket('almacmillan-hark') 
    mime = mimetypes.guess_type(filename)[0] 
    k = Key(b) 
    k.key = filename 
    k.set_metadata("Content-Type", mime) 
    k.set_contents_from_strong(content) 
    k.set_acl("public-read") 

photos = PhotoUrl.objects.all().order_by("-uploaded") 
if not request.method == "POST": 
    f = UploadForm() 
    return render_to_response('awsdemo.html', {'form':f, 'photos':photos}) 

f = UploadForm(request.POST, request.FILES) 
if not f.is_valid(): 
    return render_to_response('awsdemo.html', {'form':f, 'photos':photos}) 

file = request.FILES['file'] 
filename = file.name 
content = file['content'] 
store_in_s3(filename, content) 
p = PhotoUrl(url="http://almacmillan-hark.s3.amazonaws.com/" + filename) 
p.save() 
photos = PhotoUrl.objects.all().order_by("-uploaded") 
return render_to_response('awsdemo.html', {'form':f, 'photos':photos}) 

urls.py:

(r'^awsdemo/$', 'harkproject.s3app.views.awsdemo'), 

awsdemo.html:

<div class="form"> 
    <strong>{{form.file.label}}</strong> 
    <form method="POST" action ="." enctype="multipart/form-data"> 
     {{form.file}}<br/> 
     <input type="submit" value="Upload"> 
    </form> 
</div> 

मैं वास्तव में मदद की सराहना करेंगे। मुझे उम्मीद है कि मैंने पर्याप्त कोड प्रदान किया है।

सधन्यवाद अल

+2

एक चीज़ जो मैं बल्ले से बाहर देखता हूं: 'k.set_contents_from_strong (content) 'वास्तव में' set_contents_from_string' होना चाहिए। –

उत्तर

7

मुझे लगता है कि आपकी समस्या को इस लाइन है:

content = file['content'] 

Django docs से:

Each value in FILES is an UploadedFile object containing the following attributes:

  • read(num_bytes=None) -- Read a number of bytes from the file.
  • name -- The name of the uploaded file.
  • size -- The size, in bytes, of the uploaded file.
  • chunks(chunk_size=None) -- A generator that yields sequential chunks of data.

बजाय इस प्रयास करें:

content = file.read() 
0

क्या आपने Django Storages को आजमाया है? इस तरह आपको केवल स्टोरेज बैकएंड (इस मामले में s3boto) को डिफ़ॉल्ट स्टोरेज बैकएंड के रूप में निर्दिष्ट करना होगा, या इसे फ़ाइलफ़िल्ल्ड या छवि फ़ील्ड क्लास के लिए तर्क के रूप में आपूर्ति करना होगा।