Почему изображение не отображается на сервере при загрузке с помощью Retrofit Multipart? - PullRequest
1 голос
/ 18 февраля 2020

Я загружаю изображение на сервер с Retrofit Multipart.

Когда я отправляю запрос, он создает изображение вместе с переданным именем и размером.

Но когда я пытаюсь открыть это изображение в браузере, оно говорит, что изображение содержит ошибку.

Тот же случай происходил, когда я пытался отправить запрос почтальону. Но я обнаружил, что отправляю неверные параметры. Поэтому я изменил Content-Type на application/binary и разместил изображение под Body -> binary и , оно работало .

Так что я подозреваю, что отправляю неправильно Content-Type через приложение. Но я проверил и ничего не нашел

С ApiInterface.java

@Multipart
@POST("wp-json/wp/v2/media/")
Call<ImagePostResult> uploadImage(@Header("Authorization") String authHeader,
                                  @Header("Content-Type") String contentType,
                                  @Header("Content-Disposition") String contentDisposition,
                                  @Part MultipartBody.Part file,
                                  @Part("description") RequestBody description);

мой запрос:

private void uploadIdentityProofImageToServer() {
    progressDialog.setMessage("Uploading identity proof");

    ApiInterface apiInterface = getApiInterfaceObj();

    // For BasicAuth
    String authHeader = getAuthHeader();

    //File creating from selected URL
    String imageLocalPath = orderDetailsArrayList.get(getAdapterPosition()).getCapturedPhotoPath();//encoded image
    Uri tempUri = orderDetailsArrayList.get(getAdapterPosition()).getTempUri();// uri of image

    File file = new File(imageLocalPath);

    // create RequestBody instance from file
    RequestBody requestBodyFile = RequestBody.create(MediaType.parse(mContext.getContentResolver().getType(tempUri)), file);

    String fileName = file.getName();
    MultipartBody.Part body = MultipartBody.Part.createFormData("picture", fileName, requestBodyFile);

    String descriptionString = "Sample description";
    RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);

    String contentType = "application/binary";
    String contentDisposition = "attachment; filename =  " + fileName;


    Call<ImagePostResult> resultCall = apiInterface.uploadImage(
            authHeader,
            contentType,
            contentDisposition,
            body,
            description);

    resultCall.enqueue(new Callback<ImagePostResult>() {
        @Override
        public void onResponse(Call<ImagePostResult> call, Response<ImagePostResult> response) {
            // Response Success
            if (response.isSuccessful()) {
                ImagePostResult imagePostResult = response.body();
                String raw = imagePostResult.getGuid().getRaw();

                updateThePathOfImage(raw);
            }
            Log.d(TAG, "onResponse: " + response.message());
        }

        @Override
        public void onFailure(Call<ImagePostResult> call, Throwable t) {
            Log.d(TAG, "onFailure: " + t);
            progressDialog.dismiss();
            Toast.makeText(mContext, "" + t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

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

1 Ответ

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

Я нашел его

Я следовал коду решения, указанному в конце этой проблемы

Вот мой маленький модифицированный код

@POST("wp-json/wp/v2/media/")
Call<ImagePostResult> postEventPhoto(
        @Header("Authorization") String accessToken,
        @Header("Content-Type") String contentType,
        @Header("Content-Disposition") String contentDisposition,
        @Body RequestBody photo);

Вот запрос

        // For BasicAuth
        String authHeader = getAuthHeader();

        String contentType = "application/binary";
        String contentDisposition = "attachment; filename =  " + fileName;

        RequestBody requestBodyee = null;
        try {
            InputStream in = new FileInputStream(file);

            byte[] buf;
            buf = new byte[in.available()];
            while (in.read(buf) != -1) ;
            requestBodyee = RequestBody
                    .create(MediaType.parse("application/octet-stream"), buf);
        } catch (IOException e) {
            e.printStackTrace();
        }


        Call<ImagePostResult> imagePostResultCall = apiInterface.postEventPhoto(
                authHeader,
                contentType,
                contentDisposition,
                requestBodyee);
        imagePostResultCall.enqueue(new Callback<ImagePostResult>() {
            @Override
            public void onResponse(Call<ImagePostResult> call, Response<ImagePostResult> response) {
                // Response Success
                if (response.isSuccessful()) {
                  // yaay
                }
            }

            @Override
            public void onFailure(Call<ImagePostResult> call, Throwable t) {
                Log.d(TAG, "onFailure: " + t);
            }
        });
...