2012-01-11 244 views
6

publicación desde una aplicación (iOS Android, etc.) no es un formulario web.Cómo guardar una imagen usando django imageField?

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

@csrf_exempt 
def saveImage(request): 

Cómo escribir la vista? recibe una imagen en una solicitud posterior. Cada cosa que encuentro es relacionada con la forma (novato del servidor)

+0

echar un vistazo a [Django-photologue] (http://code.google.com/p/django-photologue/), todo lo que quiere hacer ya está hecho :) – juliomalegria

+0

gracias, no necesito todas estas características, estoy buscando las más básicas uso de imageField :) –

Respuesta

15

El hecho de que usted no está utilizando un formulario HTML real para presentar los datos no significa que usted no puede utilizar un ModelForm para procesar la solicitud:

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

obtengo éxito de resultados, pero no veo el archivo guardado en la ruta que establecí en el modal (es la ruta local: Users/yogevshelly/Downloads /) cuando intento simplemente guardar la imagen en el disco usando Image.save ('ruta', 'JPEG') veo el archivo, pero tengo que agregar '/' al inicio de la ruta. ¿algunas ideas? gracias –

+0

Vaya, las imágenes se guardaron muy bien, solo en relación con la carpeta del proyecto y no con la carpeta raíz de mi computadora, ¡muchas gracias! –

+0

Y no se olvide de incluir 'enctype =" multipart/form-data "' en la plantilla de formulario como se indica en http://stackoverflow.com/a/5567063/955619 – Caumons

3

Editar: favor utilice la respuesta elegida por encima de - el código de abajo funciona para la pregunta, pero no se recomienda.

El archivo de imagen se va a cargar se puede encontrar en:

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

no le devuelven un objeto de imagen, sino más bien un objeto UploadedFile. Puede leer esta parte de los documentos (supongo que está utilizando Django 1.3.x): https://docs.djangoproject.com/en/1.3/topics/http/file-uploads/#handling-uploaded-files

Cubre los campos y métodos disponibles en el objeto UploadedFile, y también una forma común de manejar cargas de archivos manualmente. Puede usar el mismo método para escribir el archivo de imagen en un objeto de archivo y luego guardarlo en su ImageField.

El siguiente código debería funcionar, pero no es un código seguro. Supongo que está utilizando la máquina * nix, si no, guarde el archivo de destino en otro lugar.

@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 

Otras cosas para tomar nota: Asegúrese de que la forma tiene el atributo siguiente para que funcione:

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

no recuerdo este uso es normal, pero en realidad, se recomiendan las formas.

+0

gracias, lo sé. ¿ahora que? ¿Cuál es el flujo? ¿Lo guardo en un archivo físico y simplemente paso la ruta al imageField? cualquier fragmento es una tarea muy común, ¡gracias! –

+0

He actualizado la respuesta con código de muestra. El código sería mucho más simple y seguro si usó Formularios del modelo. –

Cuestiones relacionadas