2013-07-17 4 views
6

Chcę przechowywać obrazy mojej witryny w bazie danych Kasandra! Muszę czytać i przechowywać bajty obrazu. Czy masz dla mnie fajny kod? Używam Pythona2.7, framework django i silnika cql!Jak zapisać obraz jako pole bajtów w bazie danych Kasandra za pomocą silnika cql?

To jest mój kod:

1- Mój 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- moja forma:

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

3- moim zdaniem:

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)) 

Moje Szablon:

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

Moja BŁĄD w wytopione Szablon:

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 

Jaki jest Twój pomysł? Proszę mnie poprowadzić ...

+2

Osobiście staram się unikać zapisywania plików binarnych (w szczególności pliki multimedialne, takie jak obrazy, pliki audio i wideo) w bazie danych. Zazwyczaj zapisuję adres URL do obrazu w bazie danych, ale dane obrazu są zapisywane gdzieś tak, jak Amazon S3 z CDN Cloudfront, aby przyspieszyć pobieranie dla użytkowników. Istnieje już dodatek django dla tego http://django-storages.readthedocs.org/en/latest/ – Jared

Odpowiedz

0

My Edited Widok: Możemy zapisać obraz w Cassandry bez użycia PIL:

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

Jeśli przyjrzeć się otrzymywanej wiadomości o wyjątku, to mówi AttributeError: encode. Mówi ci to, że gdzieś w tej ścieżce kodu coś szuka atrybutu (lub najprawdopodobniej metody) zwanego "kodowaniem" jakiegoś obiektu i nie znajduje go.

Podejrzewam, że nie przekazuje się właściwego obiektu typu kaczka do cqlengine dla UserImage.image. Czy wie jak mówić o obiektach PIL Image? Wątpię. Założę się, że cqlengine szuka typowej metody łańcucha pythonowego .encode (http://docs.python.org/2/library/stdtypes.html#str.encode). Zamiast podawać obraz PIL, spróbuj podać tylko surowe bajty, które otrzymujesz z formularza.