Java中用URLConnection查詢Web檔案大小

banq發表於2024-06-13

HTTP協議提供了有關所請求 Web 資源的全面資訊。其標頭欄位之一Content-Length指定資源的大小(以位元組為單位)。我們可以使用 URLConnection 類提取此資訊。

在下載之前瞭解網頁檔案的大小有助於估計下載資源所需的網路資料量。

在本教程中,我們將探討如何使用URLConnection類的getContentLengthLong()和getHeaderField()方法獲取 Web 檔案的大小。

HTTP內容長度
Content -Length屬性在 HTTP 標頭中指定 Web 檔案的大小。由於 HTTP 是一種傳輸協議,因此它提供了傳入響應的詳細資訊。簡而言之,Content -Length欄位表示響應主體的大小(以位元組為單位)。

此外,可以指定Transfer-Encoding欄位並將其設定為 chunked,而不是Content-Length欄位。在這種情況下,我們無法確定 Web 檔案的大小,因為下載是分塊進行的。

值得注意的是,Content-Length標頭並不總是準確的。伺服器可以將此欄位設定為任意值,這可能並不代表真實的檔案大小。例如,在 Spring 應用程式中使用ResponseEntity時,開發人員可以將標頭欄位設定為任意值,這可能與響應主體的實際大小不符。

getContentLength()和getContentLengthLong()方法
Java 中的URLConnection類提供了與 URL 資源建立連線以進行寫入或讀取操作的方法。

它提供了一個名為getContentLength()的方法,該方法以整數形式返回 HTTP 標頭欄位的內容長度。但是,此方法無法表示大於 Integer.MAX_VALUE的數字,這意味著它無法處理大於 2 GiB 的檔案大小。

為了解決getContentLength() 方法的限制,URLConnection類提供了getContentLengthLong() 方法,該方法將內容長度返回為長值。此方法是首選方法,因為它可以檢索超過Integer.MAX_VALUE的大檔案大小。

值得注意的是,當HTTP 標頭中缺少Content-Length欄位時, getContentLength()和getContentLengthLong()方法將返回 -1 。

使用getContentLengthLong()方法
讓我們看一個從“ https://www.ingka.com/wp-content/uploads/2020/11/dummy.pdf ”檢索虛擬 PDF 檔案大小的示例。

首先,讓我們定義一個代表 Web 檔案的 URL 的URL例項:

String fileUrl = <font>"https://www.ingka.com/wp-content/uploads/2020/11/dummy.pdf";
URL url = new URL(fileUrl);

接下來,讓我們建立一個URLConnection物件並開啟到此 URL 的連線:

URLConnection urlConnection = url.openConnection();

然後我們來獲取一下網頁檔案的大小:

long fileSize = urlConnection.getContentLengthLong();
if (fileSize != -1) {
    assertEquals(29789, fileSize);
} else {
    fail(<font>"Could not determine file size");
}

在上面的程式碼中,我們呼叫urlConnection物件上的getContentLengthLong()方法來獲取估計的檔案大小。然後,我們斷言估計的檔案大小等於預期大小。

另外,我們還處理了無法確定網路檔案大小的情況。

使用getHeaderField()方法
或者,我們可以使用getHeaderField()方法來檢索 Web 檔案大小。該方法返回它作為引數接受的名稱欄位值。

以下是使用getHeaderField()方法的示例:

@Test
void givenUrl_whenGetFileSizeUsingURLConnectionAndGetHeaderField_thenCorrect() throws IOException {
    URL url = new URL(fileUrl);
    URLConnection urlConnection = url.openConnection();
    String headerField = urlConnection.getHeaderField(<font>"Content-Length");
    if (headerField != null && !headerField.isEmpty()) {
        long fileSize = Long.parseLong(headerField);
        assertEquals(29789, fileSize);
    } else {
        fail(
"Could not determine file size");
    }
}

在上面的程式碼中,我們在URLConnection物件上呼叫getHeaderField() 方法並指定Content-Length標頭欄位。由於該方法返回一個字串,我們將其值解析為long型別,並斷言返回大小等於預期大小。
 

相關文章