回答
你可以使用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;
簡短的回答:使用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;
....
請注意,並非所有服務器都會爲頭部請求返回有效的內容大小。如果內容長度= 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;
這真的是兩個答案。第一部分是有用的,有一些網絡服務器有這種不端行爲,雖然這是(另一)違反HTTP協議定義。 (2)第二部分沒有用,問題是「如何在下載前確定大小**」;所以下載數據在這裏不是一個有效的選擇。 – 2010-02-03 16:21:29
這不是真的不當行爲。一些服務器不會在單個字節流中傳送數據,例如動態生成的數據。在這些情況下(即:當「傳輸編碼」頭包含「分塊」時),數據大小僅僅是未知的。 – 2010-02-04 03:01:18
@Remy:對,在某些情況下,如動態流式傳輸,以及'chunked'編碼這種行爲是正確的。 **但是**谷歌標誌的例子並不令人討厭(這是一個英文單詞嗎?)是一種不正當行爲。 – 2010-02-05 18:57:33
- 1. 獲取文件大小,然後下載它在vb
- 2. 以編程方式共享文件夾並取消它。 (Delphi 7)
- 3. 使用文件大小讀取遠程文件大小
- 4. 以編程方式從遠程Maven回購下載工件
- 5. 如何以編程方式從Sharepoint文檔庫下載文件
- 6. Git以編程方式從遠程存儲庫獲取單個文件
- 7. 在下載之前以編程方式獲取gmail附件大小
- 8. 如何以編程方式下載大文件在C#中
- 9. 如何以編程方式使用IOS(iPhone,iPad)下載文件?
- 10. 以編程方式使用Java中的Selenium下載文件
- 11. 如何使用JS(Internet Explorer)以編程方式下載文件
- 12. Android:使用瀏覽器以編程方式下載文件
- 13. 獲取遠程託管文件的文件大小
- 14. 使用Jsch獲取文件大小fron Unix遠程服務器
- 15. 如何使用iPhone SDK獲取遠程文件的大小?
- 16. PHP:無需下載文件即可獲得遠程文件大小
- 17. 如何以編程方式從SharePoint站點下載文件?
- 18. 如何以編程方式從網站下載文件c#
- 19. 以編程方式從plumtree知識目錄中下載文件
- 20. 以編程方式從filehoster下載文件
- 21. 如何以編程方式從Google Play下載APK文件?
- 22. 如何用cURL從googlecode獲取遠程文件的文件大小?
- 23. 如何獲取遠程文件大小以增加進度條?
- 24. Ajax - 下載前獲取文件大小
- 25. 使用PHP下載遠程文件(2GB)
- 26. 使用.NET遠程文件下載
- 27. 下載遠程文件
- 28. 以編程方式讀取Manifest文件?
- 29. 以編程方式讀取.resx文件
- 30. 如何以編程方式獲取OSX上'映射文件'的大小?
你打算如何下載http/ftp等? – Re0sless 2010-02-02 12:47:26
@ Re0sless,我正在使用http – Salvador 2010-02-02 13:04:23