2015-07-29 3 views
4

Hy парней!Android Volley Library: Как отправить изображение на сервер?

У меня есть jpg image stored on my device, и я хочу sent it to server (mywebsite.com/api.php). Я хотел бы использовать volley library, потому что он сделан официальными разработчиками Android из Google, и я думаю, что они как можно скорее добавят его в sdk.

Сейчас я использую ниже код для отправки строк на сервер:

postRequest = new StringRequest(Request.Method.POST, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        try { 
         // code here for response 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        // code here for error response 
       } 
      } 
    ) { 
     @Override 
     protected Map<String, String> getParams() { 
      Map<String, String> params = new HashMap<>(); 
      // the POST parameters: 
      params.put("key", "myApiKey"); 
      params.put("data","stringOfMyData"); 
      return params; 
     } 
    }; 

Как я могу отправить JPG на сервер с залпового библиотеки? Каждый раз, когда я отправляю что-то, мне нужно отправить его вместе с ключом API, чтобы получать информацию на сервер, поэтому я не могу изменить Map<String, String> на Map<String, File>, потому что мой ключ API - это строка.

Я прочитал, что есть решение по изменению моего изображения на byte[] array, а затем преобразование его в формат base64 string, но я хотел бы избежать этого, если это возможно.

Есть ли другие решения для отправки изображения без преобразования его в base64 string?

Любые рекомендации или советы приветствуются! Заранее спасибо!

ответ

3

Файлы отправлены с использованием multipart поддержки в POST. Это то же самое, что и в HTML-формах.

Volley по умолчанию не поддерживает многопользовательскую поддержку, но он является гибким, поэтому вы можете расширить его класс Request, чтобы реализовать свою собственную версию multipart.

Вы можете найти одну реализацию MultipartRequest класса от этой сущности и просто использовать в вашей программе https://gist.github.com/ishitcno1/11394069

Вы можете потреблять этот класс что-то вроде этого:

HashMap<String, String> params = new HashMap<String, String>(); 

    String url = "YOUR POST URL"; 
    String image_path = "your local image path"; 

    params.put("your_extra_params", "value"); 

    MultipartRequest multipartRequest = 

      new MultipartRequest(url, params, image_path, new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        Log.e(TAG, "Success Response: " + response.toString()); 

       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 

        if (error.networkResponse != null) { 
         Log.e(TAG, "Error Response code: " + 
           error.networkResponse.statusCode); 


         try { 



        } 


        if (error instanceof NetworkError) { 
        } else if (error instanceof ServerError) { 
        } else if (error instanceof AuthFailureError) { 
        } else if (error instanceof ParseError) { 
        } else if (error instanceof NoConnectionError) { 
        } else if (error instanceof TimeoutError) { 
        } 
       } 
      }); 

    requestQueue.add(multipartRequest); 
+0

Я не полностью undertand конструкторы из пример github. И параметры 'new MultipartRequest (url, params, image_path, ...' не соответствуют аргументам конструкторов MultipartRequest. Из-за этого я получаю следующую ошибку и возможное решение: Can not Resolve Constructor ... Изменить подпись MultipartRequest –

+0

Я думаю, что правильный порядок параметров: 'multipartRequest = new MultipartRequest (url, imagePath, params, ...)', потому что порядок параметров конструктора является 'public MultipartRequest (String url, String filePath, String routeId, ...)', но я не знать, что такое routeId и как я могу добавить HashMap ('HashMap ' не то же самое, что 'String') –

+0

Вы можете посмотреть [мой ответ здесь] (http://stackoverflow.com/questions/16797468/how-to-send-a-multipart-form-data-post-in-android-with-volley/31718902 # 31718902). Два варианта: с или без HttpEntity :-) – BNK

Смежные вопросы