У меня есть 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
.
Если вы хотите изображение в виде строки использует 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
Gaurav вы можете преобразовать bitmap в кодировку base-64 и разместить ее так же, как и другие параметры. На стороне сервера получить базу 64 и сохранить в виде растрового изображения. – Aakash
Серверная часть не находится под моим контролем. Я просто интегрирую API, и api ожидает изображение в формате jpeg. Основная проблема заключается в том, что API недостаточно определен. –