2010-08-05 112 views
6

我是編程和Django的初學者,所以我會很感謝幫助初學者可以讓他的頭轉向!TypeError使用BOTO庫將圖像文件上傳到Django中的Amazon S3

我正在關注一個教程,以展示如何使用Boto庫將圖像上傳到Amazon S3帳戶,但我認爲它適用於Django的老版本(我在1.1.2和Python 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> 

我會很感激的幫助。我希望我已經提供了足夠的代碼。

親切的問候 AL

+2

我從蝙蝠身上看到的一件事:'k.set_contents_from_strong(content)'應該是'set_contents_from_string'。 – 2010-08-06 17:10:15

回答

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)作爲默認存儲後端,或者將其作爲參數提供給FileField或ImageField類。