[英]What is the correct encoding for Indy Tidhttp for posting XML Files?
[英]Downloading files using Indy TIdHTTP
我目前有一個程序可以從我的VPS下載文件並將其解壓縮。 我想直接從原始網站下載它,但它不起作用。 我要使其下載此鏈接:
https://bintray.com/oxidemod/builds/download_file?file_path=Oxide-Rust.zip
代替這個:
http://41.185.91.51/RSM/Oxide-Rust.zip
編輯:使用此鏈接:
https://dl.bintray.com/oxidemod/builds/Oxide-Rust.zip
即使使用SSL協議,也不起作用。
我正在使用RAD Studio 10.2 Tokyo。
我找到了以下帖子,但正在努力將其添加到當前項目中:
這是我當前的項目代碼:
unit uOxideModInstaller;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.ComCtrls,
Vcl.StdCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP, System.Zip;
type
TDownload = class;
Tfrmoxidemodinstaller = class(TForm)
lbl1: TLabel;
pb1: TProgressBar;
btn1: TButton;
btn2: TButton;
lblstatus: TLabel;
procedure btn2Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TDownload = class(TThread)
private
httpclient: TIdHTTP;
url: string;
filename: string;
maxprogressbar: integer;
progressbarstatus: integer;
procedure ExtractZip(ZipFile: string; ExtractPath: string);
procedure idhttp1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
procedure idhttp1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
procedure UpdateProgressBar;
procedure SetMaxProgressBar;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: boolean; aurl, afilename: string);
destructor Destroy; override;
end;
var
frmoxidemodinstaller: Tfrmoxidemodinstaller;
implementation
{$R *.dfm}
{ Thread }
constructor TDownload.Create(CreateSuspended: boolean; aurl, afilename: string);
begin
inherited Create(CreateSuspended);
httpclient := TIdHTTP.Create(nil);
httpclient.OnWorkBegin := idhttp1WorkBegin;
httpclient.OnWork := idhttp1Work;
url := aurl;
filename := afilename;
end;
procedure TDownload.idhttp1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
progressbarstatus := AWorkCount;
Queue(UpdateProgressBar);
end;
procedure TDownload.idhttp1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
maxprogressbar := AWorkCountMax;
Queue(SetMaxProgressBar);
end;
procedure TDownload.Execute;
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
try
httpclient.Get(url, Stream);
Stream.SaveToFile(filename);
finally
Stream.Free;
end;
end;
procedure TDownload.UpdateProgressBar;
var
ZipFile: string;
begin
frmoxidemodinstaller.pb1.Position := progressbarstatus;
frmoxidemodinstaller.lblstatus.Caption := 'Downloading...';
if frmoxidemodinstaller.pb1.Position = frmoxidemodinstaller.pb1.Max then
begin
frmoxidemodinstaller.lblstatus.Caption := 'Done Downloading. Installing...';
Sleep(2000);
ExtractZip('oxide.zip', GetCurrentDir);
end;
end;
procedure TDownload.SetMaxProgressBar;
begin
frmoxidemodinstaller.pb1.Max := maxprogressbar;
end;
destructor TDownload.Destroy;
begin
FreeAndNil(httpclient);
inherited Destroy;
end;
{ TForm1 }
procedure TDownload.ExtractZip(ZipFile, ExtractPath: string);
begin
if TZipFile.IsValid(ZipFile) then
begin
TZipFile.ExtractZipFile(ZipFile, ExtractPath);
frmoxidemodinstaller.lblstatus.Caption := 'Oxide Installed!';
DeleteFile(ZipFile);
end
else
begin
ShowMessage('Error installing oxide!');
frmoxidemodinstaller.lblstatus.Caption := 'Error Installing Oxide!';
end;
end;
procedure Tfrmoxidemodinstaller.btn1Click(Sender: TObject);
var
DownloadThread: TDownload;
link: string;
begin
link := 'http://41.185.91.51/RSM/Oxide-Rust.zip';
DownloadThread := TDownload.Create(true, link, 'oxide.zip');
DownloadThread.FreeOnTerminate := true;
DownloadThread.Start;
end;
procedure Tfrmoxidemodinstaller.btn2Click(Sender: TObject);
begin
Close;
end;
end.
這個網址:
https://bintray.com/oxidemod/builds/download_file?file_path=Oxide-Rust.zip
返回到此URL的HTTP 302重定向:
https://dl.bintray.com/oxidemod/builds/Oxide-Rust.zip
因此,您需要處理HTTP重定向。 將TIdHTTP.HandleRedirects
屬性設置為true(默認情況下為false)。
如果您使用的是Delphi 10.2 Tokyo或更高版本,則可以替代地使用Delphi自己的System.Net.HttpClient.THTTPClient
。 它不需要任何外部SSL庫,就像TIdHTTP
一樣。 確保將THTTPClient.HandleRedirects
屬性設置為true。
您需要為SSL分配IOHandler。
在您的uses子句中包含IdSSLOpenSSL,並在創建httpclient之后添加以下內容。
httpclient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(httpclient);
然后只需確保您的OpenSSL DLL位於可執行文件所在的路徑或相同的文件夾中即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.