2010-08-05 8 views
6

Sono un principiante assoluto alla programmazione e Django quindi gradirei l'aiuto che il principiante può avere in mente!TipoErrore caricamento di file di immagine su Amazon S3 in Django utilizzando la libreria BOTO

Stavo seguendo un tutorial per mostrare come caricare le immagini su un account Amazon S3 con la libreria Boto, ma penso che sia per una versione precedente di Django (I'm on 1.1.2 e Python 2.65) e qualcosa ha cambiato. Ottengo un errore: Tipo eccezione: TypeError Eccezione Valore: oggetto 'InMemoryUploadedFile' è unsubscriptable

Il mio codice è:

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> 

sarei davvero apprezzato l'aiuto. Spero di aver fornito abbastanza codice.

Cordiali saluti AL

+2

Una cosa che vedo subito: 'k.set_contents_from_strong (content)' dovrebbe essere davvero 'set_contents_from_string'. –

risposta

7

Credo che il problema è questa linea:

content = file['content'] 

Dal 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.

Prova a modificare:

content = file.read() 
0

Hai provato Django Storages? In questo modo devi solo specificare un back-end di archiviazione (s3boto in questo caso) come back-end di archiviazione predefinito o fornirlo come argomento per una classe FileField o ImageField.