2016-10-12 2 views
0

У меня есть API, который имеет тело полезной нагрузки типа String. Но имеет как json, так и image (многопартийность/форма) как часть тела полезной нагрузки. Что-то вроде этого:Как разместить многочастные/формы изображения со строковым параметром в android

json={jsonbody} [email protected]/testing.png 

Это то, что я делаю в данный момент

public static String uploadImageQuery(Context context, String urlString, String method, 
             JSONObject jsonObject, Bitmap largeImageBitmap, 
             Dialog dialog) throws IOException { 

    String responseString = null; 
    HttpURLConnection conn = null; 
    URL url = new URL(urlString); 

    conn = (HttpURLConnection) url.openConnection(); 

    Log.d(TAG, "Uploading largeImageBitmap .."); 

    conn.setConnectTimeout((int) Constants.THREE_MINUTES); 
    conn.setDoOutput(true); 
    conn.setDoInput(true); 
    conn.setUseCaches(false); 
    conn.setRequestMethod(method); 
    conn.setChunkedStreamingMode(16 * 1024); 
    conn.setRequestProperty("Transfer-Encoding", "chunked"); 

    // The “boundry” can be any string. In this example it’s **********. 
    // It’s used in the body of the request to seperate each field being submitted. 
    //conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); 
    conn.setRequestProperty("Authorization", "Bearer " + access_token); 
    conn.connect(); 


    DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream()); 
    dataOS.write(("json=" + jsonObject.toString()).getBytes(Constants.CHARSET_UTF_8)); 
    dataOS.write(("image=").getBytes(Constants.CHARSET_UTF_8)); 

    /* Standard order patten for sending multipart data*/ 
    dataOS.write(buildStartPayload().getBytes(Constants.CHARSET_UTF_8)); 
    dataOS.write(getImageBytes(largeImageBitmap)); 
    dataOS.write(buildEndPayload().getBytes(Constants.CHARSET_UTF_8)); 

    Log.d(TAG, "Posting String data to server : " + dataOS.toString()); 

    dataOS.flush(); 
    dataOS.close(); 

    // Ensure we got the HTTP 200 response code 
    int responseCode = conn.getResponseCode(); 
    String responseMessage = conn.getResponseMessage(); 
    Log.d(TAG, "Response code for upload image query : " + responseCode + " Message : " + responseMessage); 

    if (responseCode != 200) { 
     dialog.cancel(); 
     Log.e(TAG, String.format("Received the response code %d from the URL %s", responseCode, url)); 
     // DisplayMessage.error("Couldn't upload image. Please try again later.", activity); 
    } 

    // Read the response 
    InputStream is = conn.getInputStream(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] bytes = new byte[1024]; 
    int bytesRead; 
    while ((bytesRead = is.read(bytes)) != -1) { 
     baos.write(bytes, 0, bytesRead); 
    } 
    byte[] bytesReceived = baos.toByteArray(); 
    baos.close(); 
    is.close(); 

    String response = new String(bytesReceived); 
    Log.d(TAG, "Response:" + response); 

    conn.disconnect(); 
    conn = null; 
    Log.d(TAG, "Cleard the connection handle."); 

    return responseString; 
} 

private static String buildStartPayload() { 
    String contentDisposition = "Content-Disposition: form-data; name=\"testing\"; filename=\"testing.png\""; 
    String contentType = "Content-Type: image/png"; 

    // This is the standard format for a multipart request 
    StringBuilder requestBody = new StringBuilder(); 
    requestBody.append(LINE_START); 
    requestBody.append(BOUNDARY); 
    requestBody.append(LINE_END); 
    requestBody.append(contentDisposition); 
    requestBody.append(LINE_END); 
    requestBody.append(contentType); 
    requestBody.append(LINE_END); 
    requestBody.append(LINE_END); 
    return requestBody.toString(); 
} 

private static String buildEndPayload() { 
    // This is the standard format for a multipart request 
    StringBuilder requestBody = new StringBuilder(); 
    requestBody.append(LINE_END + LINE_START + BOUNDARY + LINE_START + LINE_END); 
    return requestBody.toString(); 
} 

Я использовал HttpURLConnection до того, чтобы разместить многослойную/форму изображения и пытался делать это с помощью DataOutputform, но я получаю «Плохой запрос ". Есть ли библиотека, которая может помочь? Я использую основной залп, но у него нет хорошей поддержки изображения. Я не пробовал Retrofit, но не хочу идти туда прямо сейчас. Я надеюсь, что это можно сделать, используя HttpURLConnection.

+0

Если вы хотите изображение в виде строки использует Base 64 - https://www.base64-image.de/ - если вы не имеете в виду это, тогда используйте Volley для запроса строки, а затем используйте что-то вроде picasso для обработки изображения http: // square.github.io/picasso/ - это то, что я использую, но вы также можете использовать Glide https://github.com/bumptech/glide, а другой популярный - Universal Image Loader https://github.com/nostra13/Android -Universal-Image-Loader – Tasos

+0

Gaurav вы можете преобразовать bitmap в кодировку base-64 и разместить ее так же, как и другие параметры. На стороне сервера получить базу 64 и сохранить в виде растрового изображения. – Aakash

+0

Серверная часть не находится под моим контролем. Я просто интегрирую API, и api ожидает изображение в формате jpeg. Основная проблема заключается в том, что API недостаточно определен. –

ответ

0

Вы, возможно, потребуется для кодирования изображения в строки, а затем положить, что Строка в тело запроса.

Если вы используете залп, вы можете попробовать это:

StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response 
      .Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.d(TAG, "onResponse() called with: response = [" + response + "]"); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.d(TAG, "onErrorResponse() called with: error = [" + error + "]"); 
     } 
    }) { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      Map<String, String> params = new HashMap<>(); 
      params.put("img", BASE64_IMG); 
      return params; 
     } 
    }; 
    mRequestQueue.add(stringRequest); 

Переопределить getParams и положить Params в запросе.

Вы должны закодировать свое изображение на строку, используя Base64.

+0

Как я уже упоминал в вопросе, сервер ожидает многочастное/образное изображение, а не base64 string –

0

вы можете использовать эту ссылку библиотека click here..

compile "cz.msebera.android:httpclient:4.4.1.2" 

код для добавления изображения

protected String doInBackground(Void... params) { 
      String result = ""; 
      try { 
       HttpClient client = new DefaultHttpClient(); 
       HttpPost post = new HttpPost("your url"); 
       post.setHeader("key", Key_for_XYZ); 

       MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); 
       entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
       entityBuilder.addTextBody("id", id); 
       entityBuilder.addTextBody("name", fnm); 
       // file path..... 
       entityBuilder.addBinaryBody("uploaded_file", destination); 

       cz.msebera.android.httpclient.HttpEntity entity = entityBuilder.build(); 
       post.setEntity(entity); 
       cz.msebera.android.httpclient.HttpResponse response = client.execute(post); 
       cz.msebera.android.httpclient.HttpEntity httpEntity = response.getEntity(); 
       result = EntityUtils.toString(httpEntity); 
       Log.e("result", result); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return result; 
     } 

// убедитесь, что он импортируйте пакеты ...

import cz.msebera.android.httpclient.client.HttpClient; 
import cz.msebera.android.httpclient.client.methods.HttpPost; 
import cz.msebera.android.httpclient.entity.mime.HttpMultipartMode; 
import cz.msebera.android.httpclient.entity.mime.MultipartEntityBuilder; 
import cz.msebera.android.httpclient.impl.client.DefaultHttpClient; 
import cz.msebera.android.httpclient.util.EntityUtils; 
+0

Где вы добавляете изображение в тело? И сервер исключает мульти = часть/форма для изображения –

+0

изображение является файлом. вы можете сделать с помощью нового файла (путь) –

+0

Его растровое изображение, но есть ожидаемый формат multi/part для отправки изображений –

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