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?
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.
DeCodeGuru - Mi 11.09.02 19:16
hey, danke. :) Werde das morgen mal ausprobieren.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!