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

{
  files[]
}

Это мой интерфейс

public interface UserClient {
    @Multipart
    @POST(".")
    Call<JsonElement> upload(
            @Part("text") RequestBody text,
            @Part("image") RequestBody image,
            @Part("login") RequestBody login,
            @Part List<MultipartBody.Part> files
    );
}

Это мой метод загрузки

public void uploadFiles(String text) {
    QBUser user = SharedPrefsHelper.getInstance().getQbUser();
    String userName = user.getFullName();
    String image = "https://image.flaticon.com/icons/svg/146/146031.svg";
    String URL = URLs.URL_POST + user.getPhone() + "/";

    RequestBody textPart = RequestBody.create(MultipartBody.FORM, text);
    RequestBody imagePart = RequestBody.create(MultipartBody.FORM, image);
    RequestBody loginPart = RequestBody.create(MultipartBody.FORM, userName);

    //list of files
    List<MultipartBody.Part> filesList = new ArrayList<>();
    for (int i = 0; i < arrayList_FilePath.size(); i++) {
        filesList.add(prepareFilePart("files" + i, arrayList_FilePath.get(i)));
    }
    //Create retrofit instance
    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl(URL)
            .addConverterFactory(GsonConverterFactory.create());
    Retrofit retrofit = builder.build();

    UserClient client = retrofit.create(UserClient.class);

    Log.i(TAG, "uploadFiles: " + filesList);
    Call<JsonElement> call = client.upload(textPart, imagePart, loginPart, filesList);

    call.enqueue(new Callback<JsonElement>() {
        @Override
        public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
            finish();
            Toast.makeText(getApplicationContext(), "Successful: " + response.message(), 
            Toast.LENGTH_LONG).show();
            Log.i(TAG, "onResponse: " + response.body() + response.message());
        }

        @Override
        public void onFailure(Call<JsonElement> call, Throwable t) {
            Toast.makeText(getApplicationContext(), "failed", Toast.LENGTH_LONG).show();
        }
    });
}

Это метод preparefilePart

public MultipartBody.Part prepareFilePart(String partName, String path){
    long imagename = System.currentTimeMillis();
    File file = new File(path);
    RequestBody requestBody = RequestBody.create(
            MediaType.parse("image/*"),
            file
    );
    return MultipartBody.Part.createFormData(partName, imagename + ".jpeg" ,requestBody);
}

Если я отправляю только текстовый запрос без изображений, он работает нормально, но когда я отправляю изображение, он не работает, он выдает ошибку Code 500 Internal Server Error с нулевым ответом в теле

Примечание: Api отлично работает в Postman

Postman Snipet

0
Sohaib Khan 16 Апр 2020 в 08:58

1 ответ

Лучший ответ

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

Ссылка на GitHub для создания файла

Также внесены небольшие изменения в мой код в соответствии с этим ответом ссылка для ответа на stackoverflow

0
Sohaib Khan 16 Апр 2020 в 09:01