【问题标题】:Download CSV in Delphi 5 with Indy使用 Indy 在 Delphi 5 中下载 CSV
【发布时间】:2011-10-25 20:57:57
【问题描述】:

我知道有很多 Indy 线程,但我找不到与我的情况相匹配的线程。

我收到了一个带有用户名和密码表单的 URL。这然后对有多个超链接的 URL/reports.php 执行操作。

这些链接中的每一个都将指向带有 URL 变量的页面,例如将立即开始下载的reports.php?report=variablename。

到目前为止我的想法:

procedure TForm1.PostData(Sender: TObject);
var
  paramList:TStringList;
  url,text:string;
//  IdHTTP1: TIdHTTP;
  IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
  idLogFile1 : TidLogFile;
begin

  idLogFile1 := TidLogFile.Create(nil);
  with idLogFile1 do
  begin
  idLogFile1.Filename := 'C:\HTTPSlogfile.txt';
  idLogFile1.active := True;
  end;

  IdHTTP1 := TIdHTTP.Create(nil);
  IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocket.Create(nil);
  IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv23;
  IdHTTP1.IOHandler := IdSSLIOHandlerSocket1;


  IdHTTP1.HandleRedirects := true;
  IdHTTP1.ReadTimeout := 5000;
  IdHTTP1.Intercept := idLogFile1;

  paramList:=TStringList.create;
  paramList.Clear;
  paramList.Add('loguser=testuser');
  paramList.Add('logpass=duke7aunt');
  paramList.Add('logclub=8005');
  url := 'https://www.dfcdata.co.uk/integration/reports.php?report=live';

   try
   IdHTTP1.Post(url,paramList);
 except
  on E:Exception do
   begin
    showMessage('failed to post to: '+url);
    ShowMessage('Exception message = '+E.Message);
   end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 reportType : String;
begin
  PostData(Self);
  reportType := 'live';
  GetUrlToFile('',reportType+'.csv');
end;


procedure TForm1.GetUrlToFile(AURL, AFile : String);
var
 Output : TMemoryStream;
 success : Boolean;
begin
  success := True;
  Output := TMemoryStream.Create;
  try
    try
     IdHTTP1.Get(AURL, Output);
     IdHTTP1.Disconnect;
     except
     on E : Exception do
     begin
       ShowMessage('Get failed to GET from '+IdHTTP1.GetNamePath +'. Exception message = '+E.Message);
       success := False;
    end;
    end;

    if success = True then
    begin
    showMessage('Filed saved');
    Output.SaveToFile(AFile);
    end;
  finally
    Output.Free;
  end;
end;

每次尝试我都会收到“IOHandler 无效”错误。显然我没有正确地发布到初始页面,但谁能告诉我我错过了什么?我也可以在登录后直接点击下载 URL 还是必须使用 cookie?

谢谢

【问题讨论】:

    标签: delphi post indy delphi-5


    【解决方案1】:

    您的代码中有几个错误:

    1) PostData() 正在请求一个 HTTPS URL,但它没有将启用 SSL 的 IOHandler 分配给 TIdHTTP.IOHandler 属性。你需要这样做。

    2) Button1Click() 将 URL 传递给 GetUrlToFile(),但未指定任何协议,因此 TIdHTTP 将最终将该 URL 视为相对于其现有 URL,因此尝试从 https://www.testurl.com/test/testurl.com/test/reports.php 下载的https://testurl.com/test/reports.php。如果您想请求相对 URL,请不要包含主机名(在这种情况下甚至不要包含路径,因为您将多个请求发送到同一路径,只是不同的文档)。

    3) 您正在泄漏 TIdHTTP 对象。

    【讨论】:

    • 谢谢雷米,抱歉很多新手问题。 1)我分配了 TIdHttp1.IOHandler := IdSSLIOHandlerSocket1 但我收到错误“无法加载 SSL 库”。我附加了一个 TIdHttp1.Intercept := IdLogFile ,它只是读取“Stat Disconnected”。 2) 你是否建议我使用 GetUrlToFile('/reports.php?report=variable','test.csv'); ? 3)泄漏对象是什么意思? @Remy Lebeau - TeamB
    • 看来我的错误可能是由于错误的 SSL dll。我在 D5 中使用了最新的 Indy9 库。我加载了 dpk 并删除了所有组件,下载了最新的 10 个并运行了 Fulld5.bat。我不知道这是否是正确的升级方法,但我收到各种消息说 IndyProtocols50 不使用或不支持 IdSSLOpenSSLHeaders 和 IdSSLOpenSSL,IndyX509。
    • 看来这是 D5 的问题。我会重新发布,因为这是一个不同的问题:stackoverflow.com/questions/7902152/… 谢谢
    • 1) SSL 加载错误通常意味着您使用了错误的 OpenSSL DLL。 Indy 9 不支持官方的 DLL,它需要定制的 DLL。这在 Indy 10 中已修复。2)不,我的意思是 GetUrlToFile('reports.php?...')。 3)您从未听说过内存泄漏?您正在创建一个新的 TIdHTTP 对象,但从未释放它。
    【解决方案2】:

    问题 1) 现在已在另一篇文章中解决: Delphi 5 Indy/ics SSL workaround?

    不过,我非常感谢其他方面的帮助,如下所示。

    我是否需要使用相同的 IdHTTP 对象和其他 URL 变量进行 GET 调用?还是应该创建一个新的 IdHTTP 对象?

    我是否需要使用 cookie 记录会话,或者所有这些都可以通过同一个调用完成?

    上面的 GET 调用实际上是我需要将 csv 保存到文件吗?我也可以选择直接处理它,因为无论如何数据都需要导入。

    目前代码出现错误:EIdHTTPProtocolException

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2011-12-15
      • 1970-01-01
      相关资源
      最近更新 更多