2012-10-09 3 views
12

Webサービスから多数のpdfリンクを取得しようとしていますが、各リンクのファイルサイズを指定したいと思います。URLからファイルサイズを計算する方法

このタスクを実行する方法はありますか?

おかげ

+0

恐らく、正確なサイズを取得するには、ファイルを少なくとも1回ダウンロードする必要があります。 (あなたは将来保存することができますが、ファイルがサーバー上で変更された場合、データは古くなります) – Nishant

+1

@Nishantそれは当てはまりません。 'HTTP HEAD'リクエストは' HTTP GET'リクエストをした場合に得られる情報を返します。リクエストには返されたリクエストのサイズが含まれていなければなりません。確かに 'HEAD'リクエストを行い、レスポンスを解析することができます。 – Thor84no

+1

ああ、ok。知っておくといい。ありがとう@ Thor84no – Nishant

答えて

22

、あなたはこのような何かを行うことができます:あなたはこの値のURLConnectionオブジェクトを照会することができるように

private static int getFileSize(URL url) { 
    URLConnection conn = null; 
    try { 
     conn = url.openConnection(); 
     if(conn instanceof HttpURLConnection) { 
      ((HttpURLConnection)conn).setRequestMethod("HEAD"); 
     } 
     conn.getInputStream(); 
     return conn.getContentLength(); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } finally { 
     if(conn instanceof HttpURLConnection) { 
      ((HttpURLConnection)conn).disconnect(); 
     } 
    } 
} 
+0

以下の例外があります:java.io.IOException:サーバーがHTTP応答コード:405を返しました。私はブラウザでpdfリンクを開こうと思っています。このURLは頭の要求を許可しないでしょうか? – javaMan

+1

リクエストURLを共有できますか? –

+0

申し訳ありません...私の資格情報が必要です。私はそれを共有することはできません。 : – javaMan

6

は、HTTP HEADメソッドを使用してみてください。 HTTPヘッダーのみを返します。ヘッダContent-Lengthには必要な情報が含まれているはずです。

2

URL接続ですでにgetContentLengthを試しましたか? サーバーが有効なヘッダーに応答する場合は、文書のサイズを取得する必要があります。

しかし、Webサーバーもファイルをチャンクで返す可能性があることに注意してください。この場合、IIRCのコンテンツ長メソッドは、1つのチャンク(< = 1.4)または-1(> 1.4)のいずれかのサイズを返します。 HEADリクエストを使用して

3

HTTPレスポンスは、Content-Lengthヘッダを持っています。 URL接続が開かれた後、あなたがこのような何か試すことができます

List values = urlConnection.getHeaderFields().get("content-Length") 
if (values != null && !values.isEmpty()) { 

    // getHeaderFields() returns a Map with key=(String) header 
    // name, value = List of String values for that header field. 
    // just use the first value here. 
    String sLength = (String) values.get(0); 

    if (sLength != null) { 
     //parse the length into an integer... 
     ... 
    } 
} 
0

あなたはこれを試すことができますが...

private long getContentLength(HttpURLConnection conn) { 
    String transferEncoding = conn.getHeaderField("Transfer-Encoding"); 
    if (transferEncoding == null || transferEncoding.equalsIgnoreCase("chunked")) { 
     return conn.getHeaderFieldInt("Content-Length", -1); 
    } else { 
     return -1; 
    } 
3

受け入れ答えは、NullPointerExceptionになりやすいしないでファイル> 2GiBで動作し、getInputStream()への不要な呼び出しが含まれています。固定コードは次のとおりです。

public long getFileSize(URL url) { 
    HttpURLConnection conn = null; 
    try { 
    conn = (HttpURLConnection) url.openConnection(); 
    conn.setRequestMethod("HEAD"); 
    return conn.getContentLengthLong(); 
    } catch (IOException e) { 
    return -1; 
    // Or wrap into a (custom, if desired) RuntimeException so exceptions are propagated. 
    // throw new RuntimeException(e); 
    // Alternatively you can just propagate IOException, but, urgh. 
    } finally { 
    if (conn != null) { 
     conn.disconnect(); 
    } 
    } 
}