簡體   English   中英

如何在delphi中使用Indy 10和OpenSSL通過HTTPS下載/ uplaod文件?

[英]how to download/uplaod file over HTTPS using Indy 10 and OpenSSL in delphi?

我希望我使用Indy下載文件。 我的問題是連接到SSL。 請幫助我使用HTTPS或SFTP執行此操作。

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  IdFTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdFTP1);
  IdFTP1.UseTLS:=utUseRequireTLS;
  IdFTP1.DataPortProtection:=ftpdpsPrivate;
  IdFTP1.Host := '127.0.0.1';
  IdFTP1.Username := 'ftp';
  IdFTP1.Password := '123';
  IdFTP1.Port:=21;
  IdSSLIOHandlerSocketOpenSSL1.StartSSL;
  try
    IdFTP1.Connect;
    IdFTP1.Disconnect;
  finally
    IdFTP1.Free;
  end;
end;

你正確地做到了(除了你釋放你不在同一代碼中創建的組件的事實)。 HTTPS也是如此。

IdHTTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create();
IdHTTP1.Get('https://...');

請注意,您需要OpenSSL庫https://indy.fulgan.com/ZIP/SSL.zip或任何您想要的版本來自https://indy.fulgan.com/SSL/

SFTP和FTPS之間也存在差異。 Indy的IdFTP支持SSL(FTPS)。 它不能與SFTP(使用SSH的FTP)一起使用。 如果要使用SFTP,則必須使用其他商業組件https://www.eldos.com/sbb/delphi-sftp.php

如果顯示錯誤,則應指定任何錯誤。 可能只缺少SSL庫。 如果您不知道如何下載/上傳文件,可以采用相應的方法

IdFTP1.Put (upload)
IdFTP1.Get (download)

IdHTTP1.Put/Post (upload)
IdHTTP1.Get (download)

您將需要來自單元“IdMultipartFormData”的TIdMultiPartFormDataStream,以便HTTP Post上傳文件

嗨,這是一個例子

function HttpGetFile(sUrl, sFile: String) : Boolean;
var
  GetData : TFileStream;
begin
  Result := False;
  try
    GetData := TFileStream.Create(sFile, fmOpenWrite or fmCreate);
    try
        //IdHTTP.ProxyParams.ProxyServer := '';
        //IdHTTP.ProxyParams.ProxyPort := 0;
        //IdHTTP.ProxyParams.ProxyUsername := '';
        //IdHTTP.ProxyParams.ProxyPassword := '';
        //IdHTTP.ProxyParams.BasicAuthentication := False;

        //IdHTTP.ProtocolVersion := pv1_1;
        //IdHTTP.Request.Pragma := 'no-cache';
        //IdHTTP.Request.Connection := 'Keep-Alive';
        //IdHTTP.Request.AcceptLanguage := 'en';
        //IdHTTP.Request.Referer := sTargetUrl;
        //NOTE needs files ssleay32.dll and libeay32.dll
        if (bSecure) and ( FileExists( ExtractFilePath(Application.ExeName) + 'ssleay32.dll')) 
       then begin
          IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := 
           sslvSSLv23;
          IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions :=
           [sslvSSLv2,sslvSSLv3,sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2];
          IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
          sTargetUrl := HTTPS+UPLOAD_URL;
        end
        else begin
          IdHTTP.IOHandler := nil;
          sTargetUrl := HTTP+UPLOAD_URL;      
        end;
          IdHTTP.Get(sUrl, GetData);

      Result := (IdHTTP.ResponseCode = 200);
    finally
      GetData.Free;
    end;
  except
    on E: EIdOSSLCouldNotLoadSSLLibrary do 
         ShowMessage(E.message);
    on E: EIdHTTPProtocolException do
         ShowMessage(E.message);
    on E: EIdConnClosedGracefully do
         ShowMessage(E.message);
    on E: EIdSocketError do
         ShowMessage(E.message);
    on E: EIdException do
         ShowMessage(E.message);
    on E: Exception do
      ShowMessage(E.message);
  end;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM