Передача текста и нескольких изображений в виде массива с помощью okhttp

я использую Okhttp lib для отправки данных на сервер. Я хочу установить текст и изображения в RequestBody, Для загрузки нескольких изображений на сервер с помощью Okhttp я следую эта ссылка. Я реализовал этот тип кода в своем приложении в другом классе деятельности, и он отлично работает. я имею проверено этот вопрос о том, как передать массив в RequestBody,

Мой формат arrayList такой

blockList
{
block0
{
description0 = First block
image0 = {image1, image2}
video0 = videolink
disp_order0 = 0
block0 = 0
}
block1
{
description1 = second block
image1 = {image1,image2,image2}
video1 = videolink
disp_order1 = 1
block1 = 1
}
.....
}

Мое требование: —

Теперь я хочу отправить несколько изображений в виде массива в одном параметре. Когда я отправляю первый блок, тогда имена параметров description0,image0[],video1,disp_order а также block0 а также image0[] будет содержать изображения первого блока как массив и то же самое для других.

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

Вот моя java-функция, которая устанавливает данные в RequestBody и выполняет вызов для отправки этих данных на сервер.

ProgressDialog pd;
private OkHttpClient client;

private void saveCastBoxOnServer(String castBoxTitle, String selectedCastBoxId, String selectedCategoryId,
String userId, String action, ArrayList<CastBoxBlock> blockList)
{
try
{
client = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.build();

ArrayList<CastBoxBlock> blockArrayList = blockList;
int blockSize = blockArrayList.size();

MultipartBody.Builder multipartBuilderNew = new MultipartBody.Builder().setType(MultipartBody.FORM);

for (int i = 0; i < blockSize; i++)
{

String description = blockArrayList.get(i).getBlockDescription();
String descriptionField = "description"+i;

multipartBuilderNew.addFormDataPart(descriptionField, description);

/**This is used for distribution of images and videos. After that set that
* Images and video in multipartBuilder.
**/
CastBoxBlock model = blockArrayList.get(i);

ArrayList<SelectedMediaModel> mediaModels = model.getSelectedMediaModelArrayList();
int mediaModelsSize = mediaModels.size();

String passingVideoUri = "";
String videoUri = "";
for (int j = 0; j < mediaModelsSize; j++)
{
String mediaType = mediaModels.get(j).getMediaType();if (mediaType.equals(StringKeyConstant.mediaVideo))
{
videoUri = mediaModels.get(j).getMediaPath();

if (passingVideoUri.trim().length()==0){
passingVideoUri = videoUri;
}else{
passingVideoUri = passingVideoUri + "," + videoUri;
}
}
else if (mediaType.equals(StringKeyConstant.mediaImage))
{
String imagePath = mediaModels.get(j).getMediaPath();
File sourceFile = new File(imagePath);

/**Changes whether JPEG or PNG**/
final MediaType MEDIA_TYPE = MediaType.parse(
constant.getFileExt(imagePath).endsWith("png") ? "image/png" : "image/jpeg");

String imageName = System.currentTimeMillis() + j + "_block_img.jpg";
String imageField = "image"+i+"["+j+"]";

multipartBuilderNew.addFormDataPart(imageField,imageName,
RequestBody.create(MEDIA_TYPE, sourceFile));
}
}

/**This is used to set the {@videoUri} block of videos and send to sever**/
String videoField = "video"+i;
multipartBuilderNew.addFormDataPart(videoField, passingVideoUri);

/**This will set the {@display_order} in multipartBuilder**/
String displayOrderField = "disp_order"+i;
String displayOrder = blockArrayList.get(i).getBlockIndex();
multipartBuilderNew.addFormDataPart(displayOrderField, displayOrder);

/**This will set the {@block} value in multipartBuilder**/
String blockField = "block"+i;
String block = ""+i;
multipartBuilderNew.addFormDataPart(blockField, block);
}

pd = new ProgressDialog(activity);
pd.setCancelable(false);
pd.setMessage(getResources().getString(R.string.please_wait));
pd.show();

RequestBody formBody = multipartBuilderNew
.addFormDataPart("cast_title", castBoxTitle)
.addFormDataPart("user_id", userId)
.addFormDataPart("cast_box", selectedCastBoxId)
.addFormDataPart("category", selectedCategoryId)
.addFormDataPart("action", action)
.build();Request request = new Request.Builder()
.url(ApiUtils.ADD_FETCH_USER_CAST)
.post(formBody)
.build();

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "Get Api credential fail."+call.toString());
e.printStackTrace();
}

@Override
public void onResponse(Call call, Response response) throws IOException
{
try
{
if (pd != null){
pd.cancel();
pd.dismiss();
pd = null;
}
String castSavedResponse = response.body().string();
Log.i(TAG, "castSavedResponse = " + castSavedResponse);
}
catch (Exception e){
Log.e(TAG, "***Error : onResponse() method");
e.printStackTrace();
}
}
});
}
catch (Exception e){
Log.e(TAG, "***Error : saveCastBoxOnServer()");
e.printStackTrace();
}
}

Заранее спасибо. Если кто-нибудь поможет, это будет очень ценно.

0

Решение

Когда я проверяю ваш код, я замечаю одну вещь. Я не уверен, но я думаю, что вы измените свой код на image[] место. Вы можете просто изменить свой код, как показано ниже. Я надеюсь, что это поможет вам, и вы получили решение.

Используйте этот код

String imageField = "image"+i+"[]";

Вместо

String imageField = "image"+i+"["+j+"]";

когда я передал простые изображения в виде массива в Okhttp тогда я делаю код, как указано выше. Для загрузки нескольких изображений на сервер, используя OkhttpЯ также следую эта ссылка как вы следуете.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]