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?
¿Qué dice el registro de errores de Apache? –
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
Estaba pensando que tal vez el problema podría ser con su encabezado de tipo de contenido, pero está enviando un formulario. –