как узнать размер загруженного файла до и после загрузки в Android

#android #file

#Android #файл

Вопрос:

я создаю приложение для Android для загрузки PDF-файлов с Android, а затем сохраняю их в папке во внутренней или внешней памяти. но иногда из-за плохого подключения к Интернету загрузка останавливается без завершения.например, размер файла составляет 1,1 МБ, а его загружается только до 750 КБ. теперь проблема в том, полностью ли загружается файл или нет, мое приложение показывает его как загруженный, но на самом деле это не так.итак, я хочу знать точный размер файла до и после загрузки, чтобы я мог определить, полностью ли загружен файл или нет. и хочу перезапустить загрузку. кто-нибудь может мне помочь …….. мой код

  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);

                            }
  

мой код

Комментарии:

1. Используете ли вы android.app.DownloadManager ?

2. Поделитесь кодом как вы загружаете и отслеживаете загруженный файл?

3. я редактирую код.пожалуйста, посмотрите его сейчас @NightFury

4. ‘String file_size = Long.toString(файл. длина () / 1024);’. Это нонсенс, так как tebfile не существует. Он еще не загружен.

5. ‘int bufferLength’. Это бессмысленное имя переменной. Лучше назовите его ‘bytesRead’.

Ответ №1:

Любой разумный заголовок ответа сервера будет содержать Content-Length ключ, который, как мы надеемся, будет обозначать полную длину ресурса, который вы пытаетесь загрузить.

Имея это в виду, вот краткий пример:

 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.
}