如何创建一个在Indy中创建文件下载工作的页面?

时间:2012-06-30 12:43:29

标签: delphi indy

我有一个Indy服务器,并且当URL请求文件时发送文件很简单并且似乎总是正常工作。

但我也试图设置第二个案例,如下所示:

http://example.com/getFile.html?filename=myImage.png

(这适用于动态生成的内容,因此请求静态文件不起作用。)我正在使用自定义Indy客户端并调用TIdHTTP.Get来检索所有这些文件,并在第二个用例中,它似乎遵循这个算法:

Roll 1D4.  If you rolled 2 or higher, download correctly.
Otherwise, roll 1D6 against this table of Indy exceptions and
raise one of them.
If a random exception is raised, it MUST NOT be caught inside
of Indy code.

到目前为止,常见的似乎是EIdHTTPProtocolExceptionEIdClosedSocketEIdNotConnected,但我也见过其他一些。设置一个异常处理程序以捕获这些并重试下载有时会起作用,有时它只会引发更多异常,再次看似随机而没有确定性原则。

使用静态下载用例发生此永远不会的事实告诉我,在第二个用例中可能存在一些奇怪的问题,即我的代码没有正确计算。< / p>

代码非常简单。在客户端:

procedure TdmConnection.GetFile(const URL: string; stream: TStream);

  procedure Retry;
  begin
     sleep(100);
     stream.Size := 0; //clear any aborted partial download
     http.Get(URL, stream);
  end;

begin
   try
      http.Get(URL, stream);
   except
      on EIdClosedSocket do
        Retry;
      on EIdNotConnected do
        Retry;
      on EIdHTTPProtocolException do
        Retry;
   end;
end;

在服务器端,请求运行一个生成文件的脚本(正确;我已验证该部分)并告诉Indy服务器将其作为HTTP响应返回。我尝试过简单地打开TFileStream并将其分配给Response.ContentStream,我尝试在ServeFile对象上调用Response方法,但我最终还是得到了客户端的错误相同。服务器代码的相关部分如下所示:

  if lServeFile <> '' then begin //variable set by the script
     if lServeFile = '***' then
        response.ResponseNo := 404
     else begin
       response.ResponseNo := 200;
       response.ServeFile(AContext, lServeFile);
     end;
  end;

任何有经验的Indy用户都知道我做错了什么?使用Delphi XE附带的Indy 10库存。

1 个答案:

答案 0 :(得分:1)

没关系,问题不在Indy。在进一步调试后,我最终发现有两个线程都使用IdHTTP组件,有时他们同时使用它。保证每个线程都有自己的IdHTTP解决问题。