2012-01-11 15 views
6

postare da un'app (Android iOS ecc.) Non un modulo web.Come salvare un'immagine usando django imageField?

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

@csrf_exempt 
def saveImage(request): 

Come scrivere la visualizzazione? riceve un'immagine in una richiesta di posta. Ogni cosa che ho trovato è correlato forma (server newbie)

+0

un'occhiata a [django-photologue] (http://code.google.com/p/django-photologue/), tutto quello che vuoi fare è già fatto :) – juliomalegria

+0

grazie, non ho bisogno di tutte queste funzionalità, sto cercando il più semplice utilizzo di imageField :) –

risposta

15

Solo perché non si sta usando un modulo HTML effettivo per inviare i dati non significa che non è possibile utilizzare un ModelForm per elaborare la richiesta:

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

ottengo il successo del risultato, ma non vedo il file salvato sul percorso che ho impostato nel modale (è il percorso locale: Users/yogevshelly/Downloads /) quando provo a salvare l'immagine sul disco usando Image.save ('percorso', 'JPEG') vedo il file, ma devo aggiungere '/' all'inizio del percorso. qualche idea? grazie –

+0

Oops, le immagini sono state salvate bene, solo in relazione alla cartella del progetto e non alla cartella radice del mio computer, grazie mille! –

+0

E non dimenticare di includere 'enctype =" multipart/form-data "' nel template del modulo come indicato su http://stackoverflow.com/a/5567063/955619 – Caumons

3

Edit: Si prega di utilizzare la risposta scelta sopra - il codice qui sotto lavora per la domanda, ma non è consigliabile.

Il file di immagine che si sta caricando può essere trovato in:

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

non ti restituiscono un oggetto immagine, ma piuttosto un oggetto UploadedFile. Puoi leggere questa parte dei documenti (presumo che tu stia utilizzando Django 1.3.x): https://docs.djangoproject.com/en/1.3/topics/http/file-uploads/#handling-uploaded-files

Copre i campi e i metodi disponibili nell'oggetto UploadedFile e anche un modo comune di gestire i caricamenti di file manualmente. È possibile utilizzare lo stesso metodo per scrivere il file immagine su un oggetto file e quindi salvarlo su ImageField.

Il seguente codice dovrebbe funzionare, ma non è un codice sicuro. Suppongo che tu stia usando * nix machine, in caso contrario, salva il file di destinazione da qualche altra parte.

@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 

Altre cose da prendere nota: assicurarsi che forma ha il seguente attributo per farlo funzionare:

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

non ricordo questo uso essere normale, ma in realtà, è consigliato Moduli.

+0

grazie, lo so. ora cosa? qual è il flusso? faccio a salvarlo su file fisico e basta passare il percorso al campo immagine? qualsiasi frammento dovrebbe essere un compito molto comune, grazie! –

+0

Ho aggiornato la risposta con un codice di esempio. Il codice sarebbe molto più semplice e sicuro se si utilizzassero Moduli modelli. –