2016-01-24 3 views
0

Я разработал приложение для Android, которое сделает снимок цифры и отправит ее на сервер. На сервере изображение будет проходить через нейронную сеть и распознать цифру и отправить результат обратно. Я получаю ошибку 500 вместо результатов.Получение ошибки 500 с использованием okHTTP на Android при отправке фотографии на сервер

Вот мой код для андроид:

//sendbmp is the photo taken from the camera. Its file type is .bmp 
sendbmp = Tools.getFocusedBitmap(getApplicationContext(), camera, data, focusBox.getBox()); 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    jpgbitmap = sendbmp.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    byteArray = stream.toByteArray(); 
    try { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      mJSONArray = new JSONArray(byteArray); 
      base64array = Base64.encodeToString(byteArray,Base64.DEFAULT); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    new Networkconnection().execute(); 

Это код Networkconnection() это где я отправить фотографию на сервер. Я использую okhttp:

private class Networkconnection extends AsyncTask<Void, Void, String> { 

    String result; 
    String new_result; 
    @Override 
    protected String doInBackground(Void... params) { 
     Response response; 
     OkHttpClient client = new OkHttpClient(); 
     String byteValue = String.valueOf(base64array); 
     RequestBody body = RequestBody.create(MediaType.parse("json"), base64array); 
     Request request = new Request.Builder() 
       .url(url) 
       .post(body) 
       .build(); 
     try { 
      response = client.newCall(request).execute(); 
      result = response.body().string(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return result; 
    } 

Это мой стороне сервера, используя флягу:

@app.route('/', methods=['GET','POST']) 
def hello_world(): 
    received_img = request.args.get('body') 
    decode_Imge = pic.open(BytesIO(base64.b64decode(received_img))) 
    result = Net.image_function(decode_Imge) 
return result 

if __name__ == '__main__': 
    Net = Network([784, 100,10]) 
    for x in range(0,4): 
     training_data, validation_data,test_data = load_data_wrapper() 
     Net.SGD(training_data, 30, 10, 5.0, test_data = test_data) 
    app.run(host ="MyIP") //In my code I actually have my ip address and not "MYIP" 

Примечание: При запуске сервера я не получаю сообщение об ошибке. Все классы находятся на одном документе для сервера. При печати отслеживающий я получаю следующее: Traceback (most recent call last): File "C:\Python27\lib\site-packages\werkzeug\serving.py", line 648, in inner fd = int(os.environ['WERKZEUG_SERVER_FD']) File "C:\Python27\lib\os.py", line 425, in __getitem__ return self.data[key.upper()] KeyError: 'WERKZEUG_SERVER_FD'

Здесь ошибка я получаю, к сожалению, часть ошибки блокируется с помощью кнопки: Error 500

+0

Пожалуйста, разместите полученную трассировку/ошибку. – jumbopap

+0

Это нормально? Надеюсь, что кнопка не проблема – Suji

+0

Процесс Flask должен вызывать какую-то ошибку, вы получаете там трассировку? – jumbopap

ответ

0

оказывается, я ничего не посылал на все к сервер. Ниже приведен правильный код для передачи объекта на сервер с помощью okhttp:

Это, как вы превратить его в base64:

//getting img from camera 
sendbmp = Tools.getFocusedBitmap(getApplicationContext(), camera, data, focusBox.getBox()); 
    //converting image to base64 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    jpgbitmap = sendbmp.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    byteArray = stream.toByteArray(); 
    try { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      mJSONArray = new JSONArray(byteArray); 
      base64array = Base64.encodeToString(byteArray,Base64.DEFAULT); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

это, как вы отправить его на сервер

Response response; 
     OkHttpClient client = new OkHttpClient(); 
     String byteValue = String.valueOf(base64array); 
     //RequestBody body = RequestBody.create(MediaType.parse("json"), base64array);//RequestBody.create(MediaType.parse("application/json"),base64array); 

     try { 
      MediaType MEDIA_TYPE_MARKDOWN 
        = MediaType.parse("text/x-markdown; charset=utf-8"); 


      Request request = new Request.Builder() 
        .url(url) 
        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, byteValue)) 
        .build(); 
      response = client.newCall(request).execute(); 
      result = response.body().string(); 
     } catch (Exception e) { 
      Log.d("Error: " , e.getMessage()); 
     } 

Вот как вы его обновляете на сервере, используя колбу:

try: 
    received_img = request.data 
except (Exception) as err: 
     traceback.print_exc(err) 
//remember that the image we recevied is in base64, here we are converting it to image 
imgdata = base64.b64decode(received_img) 
filename = 'some_image.bmp' # I assume you have a way of picking unique filenames 
with open(filename, 'wb') as f: 
    f.write(imgdata) 

resutl = image_function(filename)