2013-07-17 4 views
6

Ich möchte meine Website Bilder in Cassandra-Datenbank speichern! Ich muss Bildbytes lesen und speichern. Hast du einen schönen Code für mich? Ich verwende python2.7, django framework und cql-engine!Wie speichert man ein Bild als Bytes Feld in Cassandra Datenbank mit CQL-Engine?

Dies ist mein Code:

1- My Model:

from cqlengine import columns 
from cqlengine.models import Model 

class UserImage(Model): 
    Email = columns.Text(primary_key=True) 
    image=columns.Bytes(required=False) 

2- Meine Form:

class UserImage(forms.Form): 
    image=forms.ImageField() 

3- Meine Ansicht:

from MainAPP.models import UserImage as UserImageModel 
from MainAPP.forms import UsersForms 

from django.http import HttpResponse 
from cqlengine import connection 
from PIL import Image 

def UploadImage(request): 
    if request.method == 'POST': 
     form = UsersForms.UserImage(request.POST, request.FILES) 
     if form.is_valid(): 
      try: 
       image_data=Image.open(request.FILES['image']) 
      except IOError: 
       return HttpResponse("cannot upload %s"% request.FILES['image'].name) 
      connection.setup(['127.0.0.1:9160']) 
      UserImageModel.create(Email='[email protected]', image=image_data) 
      return HttpResponse('Stored Successfully!') 
    else: 
     form= UsersForms.UserImage() 
     return render_to_response('Users/uploadImage.html', {'form': form}, context_instance=RequestContext(request)) 

Meine Vorlage:

{% block content %} 
    <form enctype="multipart/form-data" method="post" action=""> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit">Upload</button> 
    </form> 
{% endblock %} 

Mein Fehler in Rendered Vorlage:

AttributeError at /uploadImage 
encode 
Request Method: POST 
Request URL: http://127.0.0.1:8000/uploadImage 
Django Version: 1.5.1 
Exception Type: AttributeError 
Exception Value: encode 

Was ist Ihre Idee? Bitte führen Sie mich ...

+2

ich persönlich versuchen, binäre Dateien zu vermeiden Speicher (insbesondere von Mediendateien wie Bilder, Audio und Video) in der Datenbank. Normalerweise speichere ich die URL auf das Bild in der Datenbank, aber die Bilddaten werden irgendwo wie Amazon S3 mit Cloudfront CDN gespeichert, um die Downloads für Benutzer zu beschleunigen. Es gibt bereits ein Django Addon für dieses http://django-storages.readthedocs.org/en/latest/ – Jared

Antwort

0

Mein Edited Ausblick: Wir speichern Bild in cassandra ohne PIL mit:

def UploadImage(request): 
    if request.method == 'POST': 
     form = UsersForms.UserImage(request.POST, request.FILES) 
     if form.is_valid(): 
      try: 
       image_data=request.FILES['image'].read() 
      except IOError: 
       return HttpResponse("cannot convert %s"% request.FILES['image'].name) 
      connection.setup(['127.0.0.1:9160']) 
      UserImageModel.create(Email='[email protected]', image=image_data) 
      return HttpResponse(request.FILES['image'].name) 
    else: 
     form= UsersForms.UserImage() 
     return render_to_response('Users/uploadImage.html', {'form': form}, context_instance=RequestContext(request)) 
2

Wenn Sie die Ausnahmemeldung betrachten, die Sie erhalten, heißt es AttributeError: encode. Das sagt Ihnen, dass irgendwo in diesem Code-Pfad etwas nach einem Attribut (oder höchstwahrscheinlich einer Methode) sucht, das bei einigen Objekten "encode" genannt wird und es nicht findet.

Ich vermute, dass Sie nicht das richtige enten-typed-Objekt an Cqlengine für UserImage.image übergeben. Weiß es, wie man PIL-Bildobjekte spricht? Ich bezweifle das. Ich wette, cqlengine sucht nach der typischen Python-String-Methode .encode (http://docs.python.org/2/library/stdtypes.html#str.encode). Übergeben Sie das PIL-Bild nicht, indem Sie nur die Rohbytes übergeben, die Sie von der Formularbuchung erhalten haben.

Verwandte Themen