Ich habe bislang immer UrlDownloadToFile bzw. URLDownloadToCacheFile verwendet, um auf bestimmte Daten im Internet zuzugreifen. Unter anderem zum Download von Programmupdates.
Das hat auch problemlos funktioniert und funktioniert auch noch weiterhin auf Desktop-Rechnern.
Aber auf aktuellen Windows Servern funktioniert das nicht mehr.
Ich erhalte nach dem Aufruf eine Rückgabewert
2148270088 bzw. INET_E_DOWNLOAD_FAILURE
Ich vermute, dass da der Internet Explorer und somit die Funktion nicht mehr funktioniert.
Ich habe danach nach Alternativen gesucht, aber bin nicht richtig fündig geworden.
Für Textdateien haben ich InternetReadFile gefunden, was sehr gut funktioniert, aber wenn ich binär-Dateien (Setup) herunterladen will, dann passt das nicht. Wahrscheinlich irgendein falsches Setting.
Code:
function GetInetFileAsString(const fileURL: string): string;
const
C_BufferSize = 4096;
var
sAppName: string;
hSession, hURL: HInternet;
Buffer: array[0..C_BufferSize] of Byte;
BufferLen: DWORD;
strHeader: String;
strPageContent: TStringStream;
AUrl:String;
begin
Result := '';
AUrl := fileURL;
sAppName := ExtractFileName(Application.ExeName);
hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
strHeader := 'Accept-Charset: utf-8'#13#10;
hURL := InternetOpenURL(hSession, PChar(AURL), PChar(strHeader), Length(strHeader), 0, 0);
try
strPageContent := TStringStream.Create('', TEncoding.Default);
try
BufferLen := 1;
while BufferLen >0 do
begin
If InternetReadFile(hURL, @Buffer[0], SizeOf(Buffer), BufferLen) then
if BufferLen > 0 then strPageContent.WriteBuffer(Buffer[0], BufferLen);
end;
Result := strPageContent.DataString;
finally
strPageContent.Free;
end;
finally
InternetCloseHandle(hURL);
end
finally
InternetCloseHandle(hSession);
end;
end;
Eine andere Variante über THTTPClient.Get funktioniert auf dem Desktop für binäre Dateien sehr gut, aber auf dem Server wird der Browser geöffnet und die Datei wird im Download-Ordner und nicht an der Stelle "DestFile" gespeichert, was keine Lösung ist.
Code:
FS := TFileStream.Create( DestFile, fmCreate);
try
HttpClient := THTTPClient.Create;
try
HttpClient.ConnectionTimeout := 5000;
HttpClient.ResponseTimeout := 5000;
lResponse := HttpClient.Get( SourceFile, FS);
finally
HttpClient.Free;
end;
finally
FS.Free;
end;
Was wäre der beste und einfachste Weg, um auf einem aktuellen Windows-Server eine binäre Datei über eine
URL herunterzuladen?
FTP würde ich am liebsten für den Download vermeiden.