2010-08-05 15 views
6

¡Soy un principiante total de programación y Django así que agradecería la ayuda que un principiante puede entender!TypeError cargando el archivo de imagen a Amazon S3 en Django usando BOTO Library

Estaba siguiendo un tutorial para mostrar cómo cargar imágenes en una cuenta de Amazon S3 con la biblioteca Boto, pero creo que es para una versión anterior de Django (estoy en 1.1.2 y Python 2.65) y algo tiene cambiado Me aparece un error: Tipo de excepción: TypeError Excepción Valor: objeto 'InMemoryUploadedFile' es unsubscriptable

Mi código es:

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> 

me lo agradecería ayuda. Espero haber proporcionado suficiente código.

Saludos cordiales AL

+2

Una cosa que veo enseguida: 'k.set_contents_from_strong (content)' realmente debería ser 'set_contents_from_string'. –

Respuesta

7

Creo que su problema es esta línea:

content = file['content'] 

Desde el 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.

probar este lugar:

content = file.read() 
0

¿Has probado Django Storages? De esta forma, solo tiene que especificar un backend de almacenamiento (s3boto en este caso) como el backend de almacenamiento predeterminado o suministrarlo como argumento a una clase FileField o ImageField.

Cuestiones relacionadas