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