невозможно разместить массив на сервере с помощью модернизации - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь опубликовать несколько изображений с массивом, но я не могу отправить его на сервер, потому что он показывает ошибку

, когда я пытаюсь отправить изображения, преобразованные в растровое изображение, он переходит в метод onFailure и показывает ошибку, как показано ниже

ошибка возвращает растровое изображение

D/Onfail: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
    AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
    AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCACKAIoDASIA
    AhEBAxEB/8QAHgABAAIDAQADAQAAAAAAAAAAAAUIBgcJAwECBAr/xABSEAABAgIFAhEGCAsJAAAA
    AAAEAAUDBgECBxQVESEIExgkJTE1QVFVV2FxlJXR1BYjNER1oRIXM0VUgZGWNzhDWGRlsbbF1fAm
    NlNWpbXB4fH/xAAYAQEBAQEBAAAAAAAAAAAAAAAAAgQDBf/EACIRAQAABAYDAQAAAAAAAAAAAAAB
    AxPhAkFhcpHBESGhcf/aAAwDAQACEQMRAD8A/toREWh44iIgIiICIiAiIgIiICIiAiIgIiICIiAi
    IgIiwmd5/lGztqqPc4vENqDrxLqL5oqOcYR9FEFC2QN78ufaQZsirJqtrDePXX7uOng01W1hvHrr
    93HTwaOdPX5dZtFWTVbWG8euv3cdPBpqtrDePXX7uOng0Kevy6zaKsmq2sN49dfu46eDWxbP7ZbO
    bSiDA5Sfr4eHC02K3mClAHXf6UIIbnO3tvLv50dG1kREBERAREQEREBERAVDdE2KM620WDsjlBvj
    U4OjOAe3kZdIjDmTQGGXm4HEHhp+tXyVEtEX+HvQ+e3ZW/fIVEyst0OmSWrEaGayUgMB+s0Y3J3c
    BaSoTUzsDWRHgj0etF37DW8Kn3cFKyWy9j0N9qzQS6yxZ9LdSI3xbo6N7gwCwDhCM90vfDno28/7
    VonRYWQT09TpUneWmR0mVrMa28AkdnFKdjm0gPNuSFr+47XRz051sjQjWVzdJAczzDNYBjHXmSE3
    igM5nmDruHfNcliZrjmL+uj36FN8/EZY7ycSd2ML3L4+Iyx3k2k/sYRZ5MUxM8qMx8xTCdDbGtrh
    XsoiLt/b0UZ865rO2i8nWJaHBmFqqfAkoO8AQpXibbkz0F066LL26Hyn/Sqd/O6IL3fEZY7ycSd2
    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

это мой метод сообщения

 private void PostInfo() {
        bitmap = ((BitmapDrawable) defoult.getDrawable()).getBitmap();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] imageBytes = baos.toByteArray();
        imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        ArrayList<String> filePaths = new ArrayList<>();
        filePaths.add(imageString);
        Log.d("strinimagess",imageString);
        //filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131304.jpg");
      // filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131300.jpgg");
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        builder.addFormDataPart("skill_years", nameField.getText().toString());
        builder.addFormDataPart("skill_where", nameField1.getText().toString());
        builder.addFormDataPart("about_work", nameField2.getText().toString());
        builder.addFormDataPart("skill_id", skill_id);
        builder.addFormDataPart("user_id", user_id);
        for (int i = 0; i < filePaths.size(); i++) {
            File file = new File(filePaths.get(i));
            builder.addFormDataPart("skill_images", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file));
        }
        MultipartBody requestBody = builder.build();
        jsonObject = new JsonObject();
        jsonObject.addProperty("skill_years", nameField.getText().toString());
        jsonObject.addProperty("skill_where", nameField1.getText().toString());
        jsonObject.addProperty("about_work", nameField2.getText().toString());
        jsonObject.addProperty("skill_id", skill_id);
        jsonObject.addProperty("user_id", user_id);
        jsonObject.addProperty("skill_images", String.valueOf(myImageList));
    RetrofitInterface jsonpost = ServiceGenerator.createService(RetrofitInterface.class,"http://littletreasure.org.in/");
    Call<InFo_Post> call = jsonpost.post(requestBody);
    call.enqueue(new Callback<InFo_Post>() {
        @Override
        public void onResponse(Call<InFo_Post> call, retrofit2.Response<InFo_Post> response) {
            if (response.isSuccessful()){
                Log.d("response", String.valueOf(response.body().getMsg()));
                Toast.makeText(Info.this, "success", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<InFo_Post> call, Throwable t) {
Log.d("Onfail",t.getMessage());
            Toast.makeText(Info.this, "failed", Toast.LENGTH_SHORT).show();
        }
    });

это моя информация Постмодельный класс

public class InFo_Post {
    private String status;
    private String msg;
    private DataModel data;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public DataModel getData() {
        return data;
    }

    public void setData(DataModel data) {
        this.data = data;
    }

    private class DataModel {
        private String skill_years;
        private String skill_where;
        private String about_work;
        private String skill_images;

        public String getSkill_years() {
            return skill_years;
        }

        public void setSkill_years(String skill_years) {
            this.skill_years = skill_years;
        }

        public String getSkill_where() {
            return skill_where;
        }

        public void setSkill_where(String skill_where) {
            this.skill_where = skill_where;
        }

        public String getAbout_work() {
            return about_work;
        }

        public void setAbout_work(String about_work) {
            this.about_work = about_work;
        }

        public String getSkill_images() {
            return skill_images;
        }

        public void setSkill_images(String skill_images) {
            this.skill_images = skill_images;
        }
    }
}

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Я написал метод, который принимает массив путей для изображений и возвращает массив StringBase64

private ArrayList<String> imagesBase64(ArrayList<String> filePathes){
    ArrayList<String> imagesBase64=new ArrayList<>();
    for (int i = 0; i <filePathes.size() ; i++) {
        Bitmap bm = BitmapFactory.decodeFile(filePathes.get(i));
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
        byte[] b = baos.toByteArray();
        String imgString = Base64.encodeToString(b, Base64.NO_WRAP);
        imagesBase64.add(imgString);
    }
    return imagesBase64;
}

, но вы должны быть уверены, что ваш внутренний приемный массив Strings base64 успешно загрузит его

0 голосов
/ 06 февраля 2020

Убедитесь, что ваш API может обрабатывать несколько файлов. Установите класс интерфейса со списком составных файлов.

@Multipart
@POST("upload")
Call<ResponseBody> uploadMultipleFilesDynamic(
        @Part("description") RequestBody description,
        @Part List<MultipartBody.Part> files);

Вторая часть реализации использует новое объявление конечной точки и передает некоторые файлы. Конвертируйте ваши файлы в multipart

 @NonNull
private RequestBody createPartFromString(String descriptionString) {  
    return RequestBody.create(
            okhttp3.MultipartBody.FORM, descriptionString);
}

@NonNull
private MultipartBody.Part prepareFilePart(String partName, Uri fileUri) {  

    File file = FileUtils.getFile(this, fileUri);
    RequestBody requestFile =
        RequestBody.create(
            MediaType.parse(getContentResolver().getType(fileUri)), 
            file
        );
    return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}   

MultipartBody.Part используется также для отправки фактического имени файла.

 List<MultipartBody.Part> parts = new ArrayList<>();
if (photoUri != null) {  
    parts.add(prepareFilePart("photo", photoUri));
}
RequestBody description = createPartFromString("hello, this is description speaking");

// create upload service client
FileUploadService service = ServiceGenerator.createService(FileUploadService.class);

// finally, execute the request
Call<ResponseBody> call = service.uploadMultipleFilesDynamic(description, parts);  
call.enqueue(...);  

Вы можете см. эту официальную ссылку: https://futurestud.io/tutorials/retrofit-2-how-to-upload-a-dynamic-amount-of-files-to-serve r

0 голосов
/ 06 февраля 2020

У вас есть только изображение или файл с этим изображением? Вы можете попробовать создать MultypartBody из данных

     private void sendFileToServer(String fileName) {
            File file = new File(fileName);
            RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);

            MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
...
...
}

Кроме того, не забудьте в своем классе WebService добавить аннотацию @Multipart в свой метод post

...