Я пытаюсь создать приложение для Android, которое отправляет изображение, снятое с телефона, на локальный сервер, работающий на фляге. Я пытаюсь сохранить качество изображения, так как буду выполнять некоторую обработку изображения в бэкэнде, поэтому я использую Volley Multi-part Request. Но так как я отправляю закодированную в Base64 строку растрового изображения в качестве одного параметра, я получаю сообщение об ошибке из сокета, как прерванный канал java.net.socketexception.
Я уже пытался уменьшить размер изображения, я также пытался просто отправить строку "привет" вместо закодированного растрового изображения. Когда я сделал это, я получил ответ типа «E / Volley: [80295] BasicNetwork.performRequest: Неожиданный код ответа 500».
public byte[] getFileDataFromDrawable(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 50, byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
}
private void uploadBitmap(final Bitmap bitmap) {
final String tags = "image";
String url="http://192.168.43.36:5000/recog";
VolleyMultipartRequest volleyMultipartRequest = new VolleyMultipartRequest(Request.Method.POST, url,
new Response.Listener<NetworkResponse>() {
@Override
public void onResponse(NetworkResponse response) {
try {
JSONObject obj = new JSONObject(new String(response.data));
Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
String imgString = Base64.encodeToString(getFileDataFromDrawable(bitmap),
Base64.NO_WRAP);
params.put("content", imgString);
// params.put("content","hi");
return params;
}
// @Override
// protected Map<String, byte[]> getByteData() {
// Map<String, byte[]> params = new HashMap<>();
// params.put("content", getFileDataFromDrawable(bitmap));
// return params;
// }
};
Volley.newRequestQueue(this).add(volleyMultipartRequest);
}
Код, который я использую в файле фляги, выглядит следующим образом: -
@app.route("/recog", methods=["POST"])
def get_face():
json1= request.get_json()
s=json1['content']
return jsonify(message="Done")
Я ожидаю, что base64 будет декодирован в файле фляги и сохранен как изображение на локальном устройстве.