web-dev-qa-db-ja.com

ダウンロードする前にファイルのサイズを知る方法は?

私はファイルをダウンロードする必要があり、 このコード を使用しています。これは基本的にAsyncTaskであり、進行状況バーを更新するためのものです。しかし、ファイルサイズがわからないので、スピナープログレスバーを使用する必要がありました。それで、通常の進行状況バーを使用できるように、ダウンロードを開始する前にファイルサイズを取得するにはどうすればよいですか?

34
Cristian

取得したHTTP ResponseオブジェクトからContent-Lengthというヘッダーを取得できます。これにより、ファイルの長さがわかります。ただし、一部のサーバーはその情報を返さず、実際のサイズを知る唯一の方法は、応答からすべてを読み取ることです。

例:

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

通常は getContentLength を使用できますが、最善のことは自分で長さを取得することです(整数の最大値をバイパスできるため)。

自分でcontent-lengthヘッダー値を解析するだけです。より長くそれを解析する。

例:

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

iは任意の文字列にできるので、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
}
17