2011-12-09 29 views
6

Tôi đang làm việc trên ứng dụng Android có giao diện với phụ trợ Django. Tôi đã triển khai webservice bằng cách sử dụng mod_wsgi và có nhiều cuộc gọi dịch vụ web hoạt động và đã được thử nghiệm, vì vậy tôi biết mọi thứ NÊN đang hoạt động. Tất cả các cuộc gọi khác hoạt động tốt. Đây là phương pháp tôi gọi trong Android để gửi ảnh.Tải tệp lên Android với dịch vụ 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"; 
    } 
} 

Đây là phương pháp tôi đang sử dụng trong tập tin views.py tôi tiếp nhận và xử lý hình ảnh:

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

Khi tôi thử phương pháp này, tôi nhận được thực sự hữu ích lỗi Apache 500 Internal Lỗi máy chủ và tôi không biết đầu mối gì đang diễn ra. Tôi biết phương pháp này làm việc vì tôi có thể sử dụng một trang tùy chỉnh html tôi đã viết để đạt các dịch vụ web mà không cần Android và nó hoạt động tốt:

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

Vì vậy, tôi nghĩ rằng phải có một cái gì đó sai với cách tôi đang định dạng gọi ở phía Android. Tôi sẽ cung cấp một bản ghi lỗi hoặc theo dõi ngăn xếp nhưng không có bất kỳ. Tôi đang nhìn vào nhật ký lỗi apache của tôi và không có gì xuất hiện. Bất cứ ai có lời khuyên nào?

EDIT: Vì vậy, tôi thiết lập ghi nhật ký django và có thể gỡ lỗi phương thức tải lên của mình khi tôi nhấn nó từ điện thoại. Dường như nó ngừng hoạt động khi tôi nói server_id = request.POST ['server_id'], do đó bằng cách nào đó, đoạn dữ liệu đó không được thiết lập đúng khi tôi đưa ra yêu cầu trong phương thức uploadFile. Bất cứ ai nhìn thấy làm thế nào tôi đang làm yêu cầu không chính xác?

+0

Nhật ký lỗi Apache nói gì? –

+0

không có gì! lol nó không hữu ích chút nào! trong khi tôi đã thiết lập mod_wsgi nó có lỗi tôi có thể tìm và sửa lỗi nhưng không có gì hiển thị cho lỗi này – Josh

+0

Tôi đã nghĩ có thể vấn đề có thể là với tiêu đề kiểu nội dung của bạn, nhưng bạn đang gửi biểu mẫu. –

Trả lời

2

Tôi đã tìm ra những gì tôi đã làm sai. Sau khi thiết lập đăng nhập django, tôi đã có thể nhìn thấy nơi nó đã bị rơi. Nó đã bị lỗi khi tôi cố truy xuất biến "server_id". Tôi đã kết thúc việc thêm biến đó vào thực thể nhiều phần dưới dạng một chuỗi ký tự thay vì đặt nó làm tiêu đề.

Các vấn đề liên quan