下载之前如何知道文件的大小?

时间:2010-06-06 04:15:42

标签: android download

我必须下载一个文件,我正在使用this code,这基本上是AsyncTask,用于更新进度条。但是,因为我不知道文件大小是什么,所以我一直不得不使用微调器进度条。那么,如何在开始下载之前获取文件大小以便我可以使用正常的进度条?

3 个答案:

答案 0 :(得分:73)

您可以从您获得的HTTP响应对象中获取名为Content-Length的标头,这将为您提供文件的长度。 但是你应该注意,有些服务器没有返回那些信息,知道实际大小的唯一方法就是从响应中读取所有内容。

示例:

URL url = new URL("http://server.com/file.mp3");
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
int file_size = urlConnection.getContentLength();

答案 1 :(得分:17)

你通常可以使用getContentLength,但最好的是它自己得到长度(因为它可以绕过整数的最大值)。

只需自己解析内容长度标头值。更好地解析它。

示例:

final URL uri=new URL(...);
URLConnection ucon;
try
  {
  ucon=uri.openConnection();
  ucon.connect();
  final String contentLengthStr=ucon.getHeaderField("content-length");
  //...
  }
catch(final IOException e1)
  {
  }

注意我可以是任何字符串,所以使用try catch,如果它是-1,空或null,则意味着您无法知道文件的大小,因为服务器不允许它。

编辑:这是一个更新的代码,使用Kotlin:

@JvmStatic
@WorkerThread
fun getFileSizeOfUrl(url: String): Long {
    var urlConnection: URLConnection? = null
    try {
        val uri = URL(url)
        urlConnection = uri.openConnection()
        urlConnection!!.connect()
        if (VERSION.SDK_INT >= Build.VERSION_CODES.N)
            return urlConnection.contentLengthLong
        val contentLengthStr = urlConnection.getHeaderField("content-length")
        return if (contentLengthStr.isNullOrEmpty()) -1 else contentLengthStr.toLong()
    } catch (ignored: Exception) {
    } finally {
        if (urlConnection is HttpURLConnection)
            urlConnection.disconnect()
    }
    return -1
}

答案 2 :(得分:0)

您可以使用以下代码:

    new Thread(new Runnable() {
  @Override
  public void run() {
    try {
      URL myUrl = new URL(url);
      URLConnection urlConnection = myUrl.openConnection();
      urlConnection.connect();
      int file_size = urlConnection.getContentLength();
      Log.i("file_size", "file_size = " + file_size);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}).start();