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?
Cosa dice il log degli errori di Apache? –
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
Stavo pensando che il problema potrebbe essere con l'intestazione del tipo di contenuto, ma stai inviando un modulo. –