如何以编程方式将csv数据下载到网页上的ashx?

时间:2014-11-04 11:43:03

标签: javascript html asp.net delphi download

我已经查看过SO建议的链接,但似乎没有相关内容,所以这里就是..

(以下实际的url和header数据已被混淆)

我非常感谢帮助自动从https网页下载数据,使用Delphi和(最好)Twebbrowser,因为我没有在Indy上取得很大成功。

在Firefox中,我导航到显示一些数据的网址:https://www.thedomain.com/folder1/Showdata.aspx?code=111,在那里我可以点击将数据下载为csv的图片。

我正在尝试使用Delphi中的Twebbrowser自动执行该过程,方法是导航到URL然后单击该图像,或者以编程方式调用与图像相同的功能。

网页显示带有锚文本的图像......

<a class="button dlCSV" href="javascript:void(0);" onclick="MyLib.DownloadCsv();return false;">Download</a>

看起来点击此按钮会导致POST

https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx
实际进行下载的

(有一堆标题)。

我首先尝试使用TWebbrowser导航到

https://www.thedomain.com/folder1/Showdata.aspx?code=111

然后在Twebbrowser窗口中手动单击该按钮。 这下载了一个名为Sendcsv.ashx的空文件。

然后我尝试使用此处的代码以编程方式单击图像: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_27493399.html。 这似乎没有做任何事情。它找到了图像并调用了它的click方法,但没有下载任何内容,也没有显示错误信息。

任何人都可以帮我处理使用Delphi下载此数据所需的代码吗?


可能有用的其他信息。

使用Firefox中调试器中的网络选项卡,我设法发现单击图像会导致POST https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx

并且有大量标题如下所示。 但是,我不知道如何编写将这些标题发送到Sendcsv.ashx的代码(如果这是我需要做的!)。

回复标题

  • 缓存控制:&#34;最大年龄= 0&#34;
  • 内容处置:&#34;附件;文件名= thedata.csv&#34;
  • 内容编码:&#34; gzip的&#34;
  • 的Content-Length:&#34; 6050&#34;
  • 的Content-Type:&#34; text / html的;字符集= UTF-8&#34;
  • 日期:&#34;星期二,2014年11月3日10:05:43 GMT&#34;
  • 附注:&#34;公共&#34;
  • 服务器:&#34;微软-IIS / 8.0&#34;
  • X-ASPNET-版本:&#34; 4.0.30319&#34;
  • X-已启动通过:&#34; ASP.NET&#34;

请求标题

  • 主机:&#34; www.thedomain.com&#34; User-Agent:&#34; Mozilla / 5.0(Windows NT 6.1;
  • WOW64; rv:33.0)Gecko / 20100101 Firefox / 33.0&#34;
  • 接受:&#34; text / html的,应用/ XHTML + xml的,应用/ XML; Q = 0.9, / 的; Q = 0.8&#34;
  • 接受语言:&#34;烯GB,EN; Q = 0.5&#34;接受编码:&#34; gzip,deflate&#34;
  • 的Referer:&#34; https://www.thedomain.com/folder1/Showdata.aspx?code=111&#34;
  • 曲奇:&#34;与rememberMe =真&#34;连接:&#34;保活&#34;
  • 的Content-Type:&#34;应用程序/ X WWW的窗体-urlencoded&#34;
  • 的Content-Length:&#34; 15972&#34;

从上传流中请求标头

  • 的Content-Type:&#34;应用程序/ X WWW的窗体-urlencoded&#34;
  • 的Content-Length:&#34; 15972&#34;

1 个答案:

答案 0 :(得分:1)

最近,对于这种情况,我一直在使用通过导入MSXML2_TLB.pas类型库获得的Microsoft XML单元。

它有一个类XMLHTTP,它与XmlHttpRequest完全相同,就像你可能从网络开发中认识到的那样。

uses SysUtils, ActiveX, AxCtrls, MSXML2_TLB;

//be sure to call CoInitialize(nil); on application or thread startup

//procedure ...
var
  reqData:string;
  req:XMLHTTP;
  str:TOleStream;
  f:TFileStream;
begin
  //Did you catch the request data? load/set/build it here:
  //reqData:=

  req:=CoXMLHTTP.Create;
  req.open('POST','https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx',false,'','');
  req.setRequestHeader('Host','www.thedomain.com');
  // try first without this one: it may not be required:
  //req.setRequestHeader('Referer','https://www.thedomain.com/folder1/Showdata.aspx?code=111');
  // same here, may not affect response
  //req.setRequestHeader('Cookie','rememberme=True');
  req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  req.setRequestHeader('Content-Length',IntToStr(Length(reqData)));
  req.send(reqData);

  if req.status=200 then
   begin
    str:=TOleStream.Create(IUnknown(req.responseStream) as IStream);
    try
      f:=TFileStream.Create('thedata.csv',fmCreate);//or TMemoryStream?
      try
        f.CopyFrom(str,str.Size);
      finally
        f.Free;
      end;
    finally
      str.Free;
    end;
   end
  else
    raise Exception.Create('CSV request failed: '+req.statusText);//parse req.responseText?
end;