Nicky Manali
Nicky Manali

Reputation: 386

how to know the size of downloaded file before and after the download in android

i m making an android app to download pdf files from android and then saving them in a folder in internal or external memory.but sometime due to bad internet connection download stops without finshing .like file size is 1.1mb and its only downloaded upto 750kb. now the problem is whether file fully download or not my app showing it as download but in real it is not.so i want to know the exact size of file befor and after download so that i can found whether file is completely download or not.and want to restart the download. can anybody help me........ my code

 String DownloadUrl = "http://www.example.com/books/"+book_name;
                            String fileName = book_name;


                            URL url = new URL(DownloadUrl);

//create the new connection





                            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

//set up some things on the connection

                            urlConnection.setRequestMethod("GET");

                            urlConnection.setDoOutput(true);

//and connect!

                            urlConnection.connect();

//set the path where we want to save the file

//in this case, going to save it on the root directory of the

//sd card.

                           // File SDCardRoot = new File("/storage/emulated/0/documents/docx/stuff/");

                            File SDCardRoot = new File(Environment.getExternalStorageDirectory()+File.separator+"MybookStore/paper/paperStuff/documents/docx/other/stuff/");
//create a new file, specifying the path, and the filename

//which we want to save the file as.

                            File file = new File(SDCardRoot,fileName);

                            String file_size = Long.toString(file.length()/1024);

                            int size_file=Integer.parseInt(file_size);
//this will be used to write the downloaded data into the file we created

                            FileOutputStream fileOutput = new FileOutputStream(file);

//this will be used in reading the data from the internet

                            InputStream inputStream = urlConnection.getInputStream();

//this is the total size of the file

                            int totalSize = urlConnection.getContentLength();

//variable to store total downloaded bytes

                            int downloadedSize = 0;

//create a buffer...

                            byte[] buffer = new byte[1024];

                            int bufferLength = 0; //used to store a temporary size of the buffer

//now, read through the input buffer and write the contents to the file

                            while ( (bufferLength = inputStream.read(buffer)) > 0 )

                            {

//add the data in the buffer to the file in the file output stream (the file on the sd card

                                fileOutput.write(buffer, 0, bufferLength);

//add up the size so we know how much is downloaded

                                downloadedSize += bufferLength;

                                int progress=(int)(downloadedSize*100/totalSize);

//this is where you would do something to report the prgress, like this maybe

//updateProgress(downloadedSize, totalSize);

                            }

my code

Upvotes: 0

Views: 2137

Answers (1)

Tadej
Tadej

Reputation: 2921

Any reasonable server response header will include a Content-Length key, which will hopefully denote the full length of the resource you’re trying to download.

With that in mind, here's a quick example:

HttpURLConnection connection = null;
InputStream input = null;
OutputStream output = null;

try {
  final URL url = new URL(resourceUrl);
  connection = (HttpURLConnection) url.openConnection();
  connection.connect();

  final int length = connection.getContentLength();
  int downloaded = 0;

  input = url.openStream();
  output = new FileOutputStream(targetFile);

  final byte[] buffer = new byte[BUFFER_SIZE];
  int read;
  while ((read = input.read(buffer)) != -1) {
    output.write(buffer, 0, read);
    downloaded += read;
  }

  if (downloaded == length) {
    // The file was successfully downloaded.
  } else {
    // The file was not fully downloaded.
  }
} catch (IOException e) {
  // Handle exception.
} finally {
  // Close resources.
}

Upvotes: 1

Related Questions