2011-12-09 19 views
6

Pracuję nad aplikacją na Androida, która współpracuje z backendem Django. Wdrożono serwis internetowy przy użyciu mod_wsgi i mam wiele wywołań usług internetowych, które działają i zostały przetestowane, więc wiem, że wszystko powinno działać. Wszystkie inne połączenia działają dobrze. Jest to metoda, którą wywołuję w Androidzie, aby wysłać zdjęcie.Prześlij plik z Androidem do serwisu WWW 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"; 
    } 
} 

Jest to metoda używam w moim views.py pliku do odbierania i przetwarzania obrazu:

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

Kiedy spróbować tej metody, pojawia się bardzo pomocna Błąd Apache 500 Internal Błąd serwera i nie mam pojęcia, co się dzieje. Wiem, że ta metoda działa, ponieważ mogę używać niestandardowej strony HTML napisałem trafić usługi internetowej bez Androida i działa prawidłowo:

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

Więc myślę, że musi być coś nie tak ze jak ja formatowania zadzwonić po stronie Androida. Dostarczyłbym dziennik błędów lub ślad stosu, ale nie ma żadnych. Patrzę na mój dziennik błędów apache i nic się nie wyświetla. Czy ktoś ma jakieś rady?

EDIT: Więc skonfigurować rejestrowanie Django i udało się debugowania moją metodę przesyłania kiedy uderzył ją z telefonu. Wygląda na to, że przestaje działać, gdy mówię: server_id = request.POST ['server_id'], więc w jakiś sposób ten fragment danych nie jest poprawnie ustawiony, kiedy wysyłam żądanie w metodzie uploadFile. Czy ktoś widzi, że nieprawidłowo wykonuję żądanie?

+0

Co mówi dziennik błędów Apache? –

+0

nic! lol to wcale nie jest pomocne! podczas konfigurowania mod_wsgi miał błędy, które mogłem znaleźć i naprawić, ale nic nie wyświetla się dla tego błędu. – Josh

+0

Myślałem, że może być problem z nagłówkiem typu treści, ale wysyłasz formularz. –

Odpowiedz

2

Wyjaśniałem, co robiłem źle. Po skonfigurowaniu rejestrowania django mogłem zobaczyć, gdzie się zawiesił. Zawodziło, gdy próbowałem pobrać zmienną "server_id". Skończyło się na dodaniu tej zmiennej do wieloczęściowej jednostki jako treści ciągu, zamiast ustawiania jej jako nagłówka.