При отправке изображения с Android на сервер Node.js оно кодируется в стиле URL и плохо декодируется - PullRequest
0 голосов
/ 12 июля 2019

Я пытаюсь отправить фотографию, сделанную моей камерой телефона / эмулятора, на сервер Node.js, поэтому кодирую ее, чтобы выполнить строковый запрос POST.

Я пытался закодировать его, используя другие ответы в Интернете, используя поток байтового массива и сжатую версию растрового изображения. На Node.js я пытаюсь декодировать его с помощью функции, которая наверняка работает; проблема в том, что кодировка, отправленная в Node.js из Java, неверна.

Вот кодировка растрового изображения:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
            imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
            byte[] b = baos.toByteArray();
            final String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);

И мой POST-запрос на строку выглядит так (я использую Volley для взаимодействия с сервером):

            StringRequest postRequest = new StringRequest(Request.Method.POST, url,
                    new Response.Listener<String>()
                    {
                        @Override
                        public void onResponse(String response) {
                            // response
                            Log.d("RESPONSE", response);
                        }
                    },
                    new Response.ErrorListener()
                    {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            // error
                            Log.d("Error.Response", "ERROR" + error);
                        }
                    }
            ) {
                @Override
                protected Map<String, String> getParams()
                {
                    Map<String, String>  params = new HashMap<String, String>();
                    params.put("image", imageEncoded);

                    return params;
                }
            };

            VolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(postRequest);

Я почти уверен, что проблема в том, что моя кодировка получает несколько дополнительных символов% при отправке на сервер, поэтому она не может быть хорошо декодирована. Я думал, что в моем коде Node.js мне пришлось использовать чанки для создания полной строки, например:

    http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      let body = [];
      req.on('data', (chunk) => {
      body.push(chunk);
      }).on('end', () => {
      body = Buffer.concat(body).toString();
      body = body.split('=');

      // More code here
   }

Мое тело будет выглядеть как

    "image=iVBORw0KGgoAAAANSUhEUgAAAHgAAACgCAIAAABIaz%2FH..."

поэтому мне пришлось использовать split, чтобы получить только кодировку, но она все равно не работала. Есть ли способ преобразовать эту строку в другую, которая не имеет такой URL-кодировки? Или пройти запрос POST без такой модификации?

1 Ответ

1 голос
/ 12 июля 2019

Похоже, вы используете библиотеку Volley. Если это так, вам следует рассмотреть возможность использования JSONObjectRequest вместо StringRequest. Это выглядело бы примерно так после того, как вы перевели ваше изображение в формат JSON String:

    String myImage = "{image:" + imageEncoded + "}"

    JSONObject obj = null;

    try {
        obj = new JSONObject(myImage);
    } catch (JSONException e1) {
        e1.printStackTrace();
    }

    JsonObjectRequest postRequest = new JsonObjectRequest(Request.Method.POST,url,obj,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {


                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

            )} {


           @Override
           public Map<String, String> getHeaders() throws AuthFailureError {
               HashMap<String, String> headers = new HashMap<String, String>();

                    headers.put("Accept", "application/json; charset=utf-8");
                    headers.put("Content-Type", "application/json; charset=utf-8");

               return headers;
           }


        };
...