我目前有一个程序可以从我的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。
我发现了以下帖子,但我很难将其添加到我当前的项目中:
Downloaded files using TIdHTTP INDY 10
这是我目前的项目代码:
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.
答案 0 :(得分:3)
此网址:
https://bintray.com/oxidemod/builds/download_file?file_path=Oxide-Rust.zip
返回HTTP 302重定向到此URL:
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。
答案 1 :(得分:1)
您需要为SSL分配IOHandler。
在您的uses子句中包含IdSSLOpenSSL,并在创建httpclient后添加以下内容。
httpclient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(httpclient);
然后确保您的OpenSSL DLL位于您的路径中或与可执行文件位于同一文件夹中。