2012-01-11 14 views
6

księgowanie z aplikacji (iOS itp. Android itp.), A nie formularz internetowy.Jak zapisać obraz za pomocą obrazu django?

class someImage(models.Model): 
    image = models.ImageField(upload_to= settings.SHARE_IMAGE_UPLOAD_PATH) 

@csrf_exempt 
def saveImage(request): 

Jak napisać widok? otrzymuje obraz w żądaniu pocztowym. Każda rzecz znajdę to postać związana (newbie serwer)

+0

przyjrzeć się [django-photologue] (http://code.google.com/p/django-photologue/), wszystko, co chcesz zrobić, zostało już zrobione :) – juliomalegria

+0

dziękuję, nie potrzebuję tych wszystkich funkcji, szukam najbardziej podstawowych użycie imageField :) –

Odpowiedz

15

Tylko dlatego, że nie używasz rzeczywiste formularza HTML, aby przesłać dane nie znaczy, że nie można użyć ModelForm przetworzyć żądanie:

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed 
from django.utils import simplejson 

def upload_view(request): 
    if request.method == 'POST': 
     form = UploadForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      result = {'success': True} 
      return HttpResponse(simplejson.dumps(result), mimetype='application/json') 
     else: 
      return HttpResponseBadRequest() 
    else: 
     return HttpResponseNotAllowed(['POST']) 
+0

Osiągam sukces, ale nie widzę pliku zapisanego na ścieżce ustawionego w modalu (jest to lokalna ścieżka: Users/yogevshelly/Downloads /), gdy próbuję po prostu zapisać obraz na dysk przy użyciu Image.save ("ścieżka", "JPEG") widzę plik, ale muszę dodać "/" do początku ścieżki. jakieś pomysły? dzięki –

+0

Ups, obrazy zostały zapisane dobrze, tylko w odniesieniu do folderu projektu, a nie folderu głównego komputera, wielkie dzięki! –

+0

I nie zapomnij o włączeniu 'enctype =" multipart/form-data "' w szablonie formularza, jak podano na http://stackoverflow.com/a/5567063/955619 – Caumons

3

Edit: Proszę używać odpowiedź wybraną powyżej - poniżej kod działa na pytanie, ale nie jest to zalecane.

Plik obrazu przesyłasz można znaleźć w:

request.FILES['image'] # assuming input name is called 'image' 

To nie zwróci ci obiektu obrazu, ale raczej obiekt UploadedFile. Możesz przeczytać tę część dokumentacji (zakładam, że używasz Django 1.3.x): https://docs.djangoproject.com/en/1.3/topics/http/file-uploads/#handling-uploaded-files

Obejmuje pola i metody dostępne w obiekcie UploadedFile, a także popularny sposób ręcznego przesyłania plików. Możesz użyć tej samej metody, aby zapisać plik obrazu do obiektu pliku, a następnie zapisać go w ImageField.

Poniższy kod powinien zadziałać, ale nie jest to bezpieczny kod. Zakładam, że używasz * maszyny nix, jeśli nie, zapisz plik docelowy gdzie indziej.

@csrf_exempt 
def saveImage(request): 
    # warning, code might not be safe 
    up_file = request.FILES['image'] 
    destination = open('/tmp/' + up_file.name , 'wb+') 
    for chunk in up_file.chunks(): 
     destination.write(chunk) 
    destination.close() 
    img = someImage() 
    img.image.save(up_file.name, File(open('/tmp/' + up_file.name, 'r'))) 
    img.save() 
    # return any response you want after this 

Inne rzeczy do odnotowania: Upewnij się, że postać ma następujący atrybut do jego pracy:

<form enctype="multipart/form-data" ... > 

Nie pamietam to zużycie jest normalne, ale tak naprawdę, formularze są zalecane.

+0

dzięki, wiem o tym. co teraz? jaki jest przepływ? czy zapisać go do fizycznego pliku i po prostu przekazać ścieżkę do imageField? wszelkie urywki powinny być bardzo częstym zadaniem, dzięki! –

+0

Zaktualizowałem odpowiedź za pomocą przykładowego kodu. Kod byłby znacznie prostszy i bezpieczniejszy, gdybyś używał Model Forms. –