2010-02-02 24 views

回答

11

你可以使用Indy。

首先包括IdHTTP

您可以檢索的大小是這樣的:

procedure TFormMain.Button1Click(Sender: TObject); 
var 
    Http: TIdHTTP; 
begin 
    Http := TIdHTTP.Create(nil); 
    try 
    Http.Head('http://live.sysinternals.com/ADExplorer.exe'); 

    ShowMessage(IntToStr(Http.Response.ContentLength)); 
    finally 
    Http.Free; 
    end; 
end; 
10

簡短的回答:使用HTTP HEAD命令,可以在印德爾福的TIdHttp組件。

詳細說明:

HTTP協議定義了HEAD方法。

9.4 HEAD

的HEAD方法等同於GET 不同的是在響應服務器不能返回 消息正文。響應於HEAD請求 的HTTP 頭中包含的元信息應當與響應於GET請求發送的信息 相同。 此方法可用於獲取 有關實體 的元信息,該請求暗示請求沒有 傳輸實體主體本身。 此方法通常用於測試 有效性的超文本鏈接, 可訪問性和最近的 修改。

到HEAD請求的響應可以是在這個意義上 緩存包含在響應 的 信息可被用於更新從該資源的先前 高速緩存的實體。如果 新的字段值表明 緩存的實體從目前 實體的不同(如將在內容長度,內容,MD5, ETag的或上次修改一個 變化來表示),那麼緩存 必須把緩存條目爲陳舊。

HEAD詢問爲等同於一個將對應於GET請求的響應,但是沒有響應體,檢索完整的響應報頭,而不需要將整個內容。

檢索到的HTTP響應頭被記錄在維基百科上的HTTP頭列表http://en.wikipedia.org/wiki/List_of_HTTP_headers

HTTP標頭形成一個HTTP請求, 的核心,是在HTTP響應非常重要的。它們定義了請求的數據 的各種特性或已提供的數據。 標題與請求或 響應正文由空白行分開。HTTP標頭 可以是幾乎任意的字符串,但通常只能理解一些 。

一個始終存在一個有效的URL來獲取內容的標題是 的Content-Length頭。

14.13 Content-Length的

的Content-Length的實體頭字段表示 尺寸實體主體的,以八比特組, 發送給收件人或十進制數,在的情況下的頭部方法 發送的實體主體的大小爲 請求爲GET。

Content-Length = "Content-Length" ":" 1*DIGIT

一個例子是

Content-Length: 3495

應用程序應使用此字段,以指示該消息體的 轉發長度,除非這是 第4.4節禁止由規則。

任何內容長度大於或等於零是 有效值。如果沒有給出Content-Length,4.4節將描述如何確定消息體的長度。

注意,此字段的意義是顯著 從MIME, 的相應定義,其中它是 「消息/外部主體」內容類型中使用的可選字段不同。在HTTP中,只要消息的長度 可以在傳輸之前確定,則應該發送它, ,除非第4.4節中的規則禁止該消息,否則應該發送它。

從Delphi中,將TIdHttp組件拖放到您的窗體中。並將下面的代碼粘貼到你的一個delphi事件處理方法中。

var 
    url: string; // must contain a fully qualified url 
    contentLength: integer; 
begin 
    .... 
    contentLength:=0; 
    try 
    Idhttp1.Head(url); 
    contentLength:=idhttp1.response.ContentLength; 
    except end; 
    .... 
3

請注意,並非所有服務器都會爲頭部請求返回有效的內容大小。如果內容長度= 0,那麼你將只知道你是否發出GET請求。例如,針對Google logo的HEAD請求返回0的內容長度,但GET返回適當的長度,但也會檢索圖像。一些服務器將返回內容長度作爲頭後數據包的長度。

您也可以使用Synapse來獲取此信息。請注意,數據被傳輸,但緩衝區被丟棄。這是一種更加可靠的方法,但需要額外的帶寬。

var 
    HTTP : tHTTPSend; 
begin 
    HTTP := THTTPSend.Create; 
    try 
    HTTP.HTTPMethod('GET',url); 
    DownloadSize := HTTP.DownloadSize; 
    finally 
    HTTP.Free; 
    end; 
end; 
+0

這真的是兩個答案。第一部分是有用的,有一些網絡服務器有這種不端行爲,雖然這是(另一)違反HTTP協議定義。 (2)第二部分沒有用,問題是「如何在下載前確定大小**」;所以下載數據在這裏不是一個有效的選擇。 – 2010-02-03 16:21:29

+0

這不是真的不當行爲。一些服務器不會在單個字節流中傳送數據,例如動態生成的數據。在這些情況下(即:當「傳輸編碼」頭包含「分塊」時),數據大小僅僅是未知的。 – 2010-02-04 03:01:18

+0

@Remy:對,在某些情況下,如動態流式傳輸,以及'chunked'編碼這種行爲是正確的。 **但是**谷歌標誌的例子並不令人討厭(這是一個英文單詞嗎?)是一種不正當行爲。 – 2010-02-05 18:57:33

相關問題