Entwickler-Ecke

Internet / Netzwerk - Größe einer Datei im Internet


DeCodeGuru - Sa 07.09.02 15:24
Titel: Größe einer Datei im Internet
Hi leute,

wie kann ich die Größe einer Datei, die auf einem HTTP-Server liegt, bestimmen?


bis11 - Sa 07.09.02 15:37

Hi,

vielleicht kannst Du ja damit etwas anfangen, da ist zumindest der Ansatz drin wie ich die Größe einer Datei erkenne.

http://www.swissdelphicenter.ch/de/showcode.php?id=330


DeCodeGuru - Sa 07.09.02 15:51

super, danke :wave:


DeCodeGuru - Mo 09.09.02 20:21

ooops, da war ich wohl etwas zu glücklich, dass ich eine antwort bekommen habe. nun ein problem: Die Quellcodes die auf der Seite stehen können nur mit lokalen Dateien funktionieren. Ich möchte aber die größe einer Datei (z.B. http://www.google.de/wasweissich/irgendwas.zip) herausfinden. Solche Dateien sind halt nicht auf der lokalen Festplatte. :wink:


M4EiB - Di 10.09.02 01:03

die länge einer datei steht im http-header unter "Content-Length".
aufrufen tust du es am besten mit dem befehl "head". erfordert nur den http-header als antwort, bei einem normalen get würde die datei auchmitgeschickt (falls du sie sowieso downloaden willst ist das natürlich zu bevorzugen).

hier code mit der indy-http-komponente:

Quelltext
1:
2:
idhttp1.Head('http://home.t-online.de/home/0724721978-0001/hlsw_0_4_2b_setup.exe');
 memo1.lines.add(inttostr(idhttp1.Response.contentlength));


sollte auch mit nmhttp1 gehen. dazu musst du aber die contentlength aus dem header auslesen.(wüsste nicht, dass man sie direkt auslesen kann)


DeCodeGuru - Di 10.09.02 10:57

hi M4EiB,

ich habs mir schon gedacht, dass das alles im Header stehen muss. Ich wollte heute eigentlich einen Http-Server schreiben, dann die Proxyeinstellungen des Browser auf meinen Server stellen und schauen, was da für Befehle ankommen. Na ja, halt keinen richtigen Server. Aber vielen Dank, hast mir ein schönes Stück Arbeit erspart.

Achja, wenn wir grade beim Thema sind und du dich so gut auskennst *gg*. Wie kann ich überprüfen, ob die Datei überhaupt verfügbar ist, also ob das nicht nur ein Fake ist?


M4EiB - Mi 11.09.02 06:32

hi

entweder gibts einen timeout. wenn der server gar nichts schickt.

falls er aber eine seite schickt, in der steht, dass die datei nicht existiert oder im moment nicht verfügbar ist. kannst du im header den eintrag "content-type" anschauen: bei html dateien steht da auch "Content-type: text/html". falls man eine text- html-datei download will, funzt das aber nicht.


DeCodeGuru - Mi 11.09.02 14:53

so, ich habe jetzt ein bisschen in der PSDK gestöbert und habe mir dann nen Quuellcode erstellt, der zwar funtzt aber unendlich lahm ist. Wenn mir einer sagen könnte, was ich noch beschleunigen könnte, da wäre ich echt dankbar. So hier, ist mal der Code.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, activex, urlmon;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  cDownloadStatusCallback = class(TObject,IUnknown,IBindStatusCallback)
  private
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
    function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
    function GetPriority(out nPriority): HResult; stdcall;
    function OnLowResource(reserved: DWORD): HResult; stdcall;
    function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult; stdcall;
    function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
    function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
    function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult; stdcall;
    function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//IUnknown interface

function cDownloadStatusCallback._AddRef: Integer;
begin
  Result := 0;
end;

function cDownloadStatusCallback._Release: Integer;
begin
  Result := 0;
end;

function cDownloadStatusCallback.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if(GetInterface(IID,Obj)) then
  begin
    Result := 0
  end
  else
  begin
    Result := E_NOINTERFACE;
  end;
end;

// IBindStatusCallback interface

function cDownloadStatusCallback.OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.GetPriority(out nPriority): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnLowResource(reserved: DWORD): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
begin
  case ulStatusCode of
    BINDSTATUS_FINDINGRESOURCE:
    begin
      Form1.Label1.Caption := 'Datei existiert';
      Result := E_ABORT;
      exit;
    end;
  end;
  //Nur so zum Aktualisierungszweck
  Application.ProcessMessages;

  Result := S_OK;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  cDown: CDownloadstatuscallback;
begin
  Label1.Caption := 'Datei existiert nicht';
  cDown := cDownloadStatusCallback.Create;
  URLDownloadToFile(nil,PChar(Edit1.Text),PChar('C:\Test.tmp'),0,cDown);
end;

end.


Also, wäre echt super, wenn jemand das ganze beschleunigen könnte. Mir fiel bis jetzt nichts auf.


Steffer - Mi 11.09.02 17:53

Probier das mal..
http://www.faqsen.de/find.jsp?FAQ=1;485548554850504851545355;2

bzw. hier hast du die Sache mit Progress...
http://www.faqsen.de/find.jsp?FAQ=1;505649504849504849494857;2


DeCodeGuru - Mi 11.09.02 19:16

hey, danke. :) Werde das morgen mal ausprobieren.