2011-12-09 12 views
6

Sto lavorando ad un'app per Android che si interfaccia con un backend Django. Ho implementato il webservice usando mod_wsgi e ho molte chiamate al servizio web che funzionano e sono state testate, quindi so che DOVREBBE lavorare. Tutte le altre chiamate funzionano bene. Questo è il metodo che chiamo su Android per inviare la foto.Carica un file con Android sul servizio web 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"; 
    } 
} 

Questo è il metodo che sto utilizzando nel mio file views.py per ricevere ed elaborare l'immagine:

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

Quando provo questo metodo, ottengo l'errore di veramente utile Apache 500 interno Errore del server, e non ho idea di cosa sta succedendo. So che questo metodo funziona perché posso usare una pagina HTML personalizzato che ho scritto per colpire il servizio web, senza Android e funziona benissimo:

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

Quindi penso che ci deve essere qualcosa di sbagliato in come sto formattazione del chiamare sul lato Android. Fornirei un log degli errori o una traccia dello stack ma non ce ne sono. Sto guardando il mio registro degli errori di Apache e non compare nulla. Qualcuno ha qualche consiglio?

EDIT: Così ho impostato la registrazione Django e sono stati in grado di eseguire il debug il mio metodo di caricamento quando mi ha colpito dal telefono cellulare. Sembra che smetta di funzionare quando dico server_id = request.POST ['server_id'], quindi in qualche modo, quella parte di dati non viene impostata correttamente quando faccio la richiesta nel metodo uploadFile. Qualcuno vede come sto facendo la richiesta in modo errato?

+0

Cosa dice il log degli errori di Apache? –

+0

niente! non è affatto utile! mentre stavo impostando mod_wsgi aveva errori che potevo trovare e correggere ma non viene mostrato nulla per questo errore – Josh

+0

Stavo pensando che il problema potrebbe essere con l'intestazione del tipo di contenuto, ma stai inviando un modulo. –

risposta

2

Ho capito cosa stavo facendo male. Dopo aver impostato la registrazione di Django, sono stato in grado di vedere dove si stava bloccando. Si è verificato un arresto anomalo quando ho cercato di recuperare la variabile "server_id". Ho finito per aggiungere quella variabile all'entità multipart come corpo di una stringa piuttosto che impostarla come intestazione.