how to getting ContentLength in Retrofit

Issue

I am using a service in my app that I used to retrofit to download some “apk” files in the background.
I want to check downloaded file size with received file size to make sure I get “apk” completely.
but when i use response.body().contentLength() it is -1!

This is my code:

 private void downloadAppFromServer(String url, final String fileId) {

    APIService downloadService = ServiceGenerator.createServiceFile(APIService.class, "181412655", "181412655");

    Call<ResponseBody> call = downloadService.downloadFileWithDynamicUrlSync(url);
    call.enqueue(new Callback<ResponseBody>() {
      @Override
      public void onResponse(Call<ResponseBody> call, final Response<ResponseBody> response) {
        if (response.isSuccess()) {
   new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... voids) {

              Log.d("LOGO", "server contacted and has file");
              Log.d("LOGO",   "FILE SIZE: " + response.body().contentLength());


              boolean writtenToDisk = writeResponseBodyToDisk(response.body(), fileId);
              Log.d("LOGO", "file download was a success? " + writtenToDisk);

              return null;
            }
          }.execute();

        }
      }

      @Override
      public void onFailure(Call<ResponseBody> call, Throwable t) {


    });
  }

And this is my writeToDisk Method:

 private boolean writeResponseBodyToDisk(ResponseBody body, String fileId) {

    try {

      // Location to save downloaded file and filename
      File DownloadFile = new File(G.DIR_APK + "/" + fileId + ".apk");
      InputStream inputStream = null;
      OutputStream outputStream = null;
      try {

        byte[] fileReader = new byte[4096];
        long fileSize = body.contentLength();
        long fileSizeDownloaded = 0;
        inputStream = body.byteStream();
          Log.d("LOGO", "file size is: " + fileSize ); //This is -1 !
        outputStream = new FileOutputStream(DownloadFile);
        while (true) {
          int read = inputStream.read(fileReader);
          if (read == -1) {
            break;
          }
          outputStream.write(fileReader, 0, read);
          fileSizeDownloaded += read;
        }
        outputStream.flush();
        if (fileSize == fileSizeDownloaded) {
          return true;
        } else {
          return false;
        }
      } catch (IOException e) {

        return false;
      } finally {
        if (inputStream != null) {
          inputStream.close();
        }
        if (outputStream != null) {
          outputStream.close();
        }
      }

    } catch (IOException e) {
      return false;
    }
  }

Solution

-1 means that web server doesnt give you any information about length of file.

Retrofit gets header content-length. If it doesnt exist response.body().contentLength() returns -1.

Answered By – Andrey Danilov

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published