2011-12-09 20 views
6

Estoy trabajando en una aplicación de Android que se conecta con un back-end de Django. Implementé el servicio web usando mod_wsgi, y tengo muchas llamadas al servicio web que funcionan y han sido probadas, por lo que sé que todo DEBERÍA estar funcionando. Todas las demás llamadas funcionan bien. Este es el método que llamo en Android para enviar la foto.Cargue un archivo con Android al servicio web de Django

public static String uploadFile(String url, int server_id, String filepath) { 
    try { 
     client.getParams().setParameter("http.socket.timeout", 90000); // 90 second 
     HttpPost post = new HttpPost(url); 

     MultipartEntity mpEntity = new MultipartEntity(); 
     mpEntity.addPart("image", new FileBody(new File(filepath), "image/jpeg")); 
     post.setEntity(mpEntity); 
     post.addHeader("server_id", String.valueOf(server_id)); 

     HttpResponse response = Connector.client.execute(post); 
     if (response.getStatusLine().getStatusCode() != 200) { return "false"; } 
     return convertStreamToString(response.getEntity().getContent()); 
    } catch (Exception e) { 
     if (Constants.DEBUG) e.printStackTrace(); 
     return "false"; 
    } 
} 

Este es el método que estoy usando en mi archivo views.py para recibir y procesar la imagen:

@csrf_exempt 
def incident_upload(request): 
    if request.method == 'POST': 
      server_id = request.POST['server_id'] 
      incident = get_object_or_404(Incident, pk=server_id) 
      imagePath = '/Library/WebServer/program/uploads/' + str(int(time.time() * 1000)) + '.jpg' 
      destination = open(imagePath, 'wb+') 
      for chunk in request.FILES['image'].chunks(): 
        destination.write(chunk) 
      destination.close() 
      incident.ImagePath = imagePath 
      incident.save() 
      return render_to_response('webservice/incident_read.html', {'incident': incident, 'device': incident.device}) 

Cuando trato de este método, tengo la gran ayuda de errores de Apache 500 internos Error del servidor, y no tengo idea de lo que está pasando. Sé que este método funciona porque puedo usar una página HTML personalizada que escribí para golpear el servicio web sin Android y funciona bien:

<html> 
<body> 
<form action="http://xxxxxxxxxxx.local/hermes/incident/upload/" enctype="multipart/form-data" method="post"> 
server_id: <input type="text" name="server_id" /> 
<br /> 
file: <input type="file" name="image" /> 
<br /> 
<input type="submit" value="send" /> 
</form> 
</body> 
</html> 

Así que creo que tiene que haber algo mal con la forma en que estoy formatear la llamar por el lado de Android. Me gustaría proporcionar un registro de error o seguimiento de la pila, pero no hay ninguno. Estoy mirando mi registro de errores de Apache y no aparece nada. Alguien tiene algún consejo?

EDITAR: Así que creó el registro de Django y han sido capaces de depurar mi método de carga cuando me golpeó en el teléfono. Parece que deja de funcionar cuando digo server_id = request.POST ['server_id'], de modo que, de alguna manera, ese dato no se establece correctamente cuando realizo la solicitud en el método uploadFile. ¿Alguien ve cómo estoy haciendo la solicitud incorrectamente?

+0

¿Qué dice el registro de errores de Apache? –

+0

nada! ¡ja ja no es nada útil! mientras estaba configurando mod_wsgi tenía errores que pude encontrar y corregir pero no aparece nada para este error – Josh

+0

Estaba pensando que tal vez el problema podría ser con su encabezado de tipo de contenido, pero está enviando un formulario. –

Respuesta

2

Me di cuenta de lo que estaba haciendo mal. Después de configurar el registro django, pude ver dónde se estaba estrellando. Se estrelló cuando traté de recuperar la variable "server_id". Terminé agregando esa variable a la entidad multiparte como un cuerpo de cadena en lugar de establecerlo como un encabezado.

Cuestiones relacionadas