2010-08-05 70 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类。

相关问题