javascript - 如何在网页上通过 ashx 以编程方式下载 csv 数据?

标签 javascript html asp.net delphi download

我查看了SO建议的链接,但似乎没有一个相关,所以这里是..

(下面的实际网址和 header 数据已被混淆)

我真的很感激一些帮助,可以使用 Delphi 和(最好)Twebbrowser 自动从 https 网页下载数据,因为我在 Indy 方面没有取得很大成功。

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

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

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

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

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

https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx

(带有大量 header )实际执行下载。

我首先尝试使用 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

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

响应 header

  • 缓存控制:“max-age=0”
  • 内容处置:“附件;文件名=thedata.csv”
  • 内容编码:“gzip”
  • 内容长度:“6050”
  • 内容类型:“text/html;charset=utf-8”
  • 日期:“2014 年 11 月 3 日星期二 10:05:43 GMT”
  • 编译指示:“公共(public)”
  • 服务器:“Microsoft-IIS/8.0”
  • X-AspNet-版本:“4.0.30319”
  • X-Powered-By:“ASP.NET”

请求 header

  • 主机:“www.thedomain.com”用户代理:“Mozilla/5.0(Windows NT 6.1;
  • WOW64; rv:33.0) 壁虎/20100101 Firefox/33.0"
  • 接受:“text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8”
  • 接受语言:"en-GB,en;q=0.5"接受编码:"gzip, deflate"
  • 推荐人:“https://www.thedomain.com/folder1/Showdata.aspx?code=111
  • Cookie:“rememberme = True”连接:“keep-alive”
  • 内容类型:“application/x-www-form-urlencoded”
  • 内容长度:“15972”

从上传流请求 header

  • 内容类型:“application/x-www-form-urlencoded”
  • 内容长度:“15972”

最佳答案

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

它有一个 XMLHTTP 类,它的作用与 XmlHttpRequest 的作用完全相同,就像您可能在 Web 开发中认识到的那样。

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;

关于javascript - 如何在网页上通过 ashx 以编程方式下载 csv 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26734305/

相关文章:

javascript - meteor JS : how to change localhost to custom domain?

javascript - 单击前模糊执行

javascript - 在 html 正文中使用脚本变量

javascript - 如何在链接按钮中使用<%= %>?

c# - VS 2010 中的状态机工作流

c# - 将数据类型 nvarchar 转换为 bigint 时出错

javascript - jQuery 在定时延迟后滚动到

Javascript 图片库

html选择下拉列表在div中不起作用

javascript - 分页替代方案