2012-09-17 125 views
3

有没有什么办法可以用casperjs下载CSV文件而不指定下载URL?我正在尝试下载CSV文件,该文件的URL是在单击下载按钮时动态生成的。所以,我可能无法在这种情况下使用download()。casperjs下载文件时不指定url

回答

2

根据记录,它使用“resource.received”事件是已经成为可能。 如果您收到这样的标题:

Content-Disposition:Attachment;文件名=“ExportData.csv”

产生可以用下面的事件监听器下载文件:

casper.on('resource.received', function(resource) { 
    if (resource.stage !== "end") { 
     console.log("resource.stage !== 'end'"); 
     return; 
    } 
    if (resource.url.indexOf('ExportData.csv') > -1) { 
     console.log("Downloading csv file"); 
     this.download(resource.url, 'ExportData.csv'); 
    } 
}); 
+0

你用什么版本? –

+0

@DiegoBorges我不记得是哪个版本。但是我发现CASPER-1.1.0-DEV有这个功能:http://docs.casperjs.org/en/latest/events-filters.html –

1

我已经找到了一个解决方案。它不是很干净,但它的工作原理:

您需要构建一个全局数组,它将每个resource.received关联一个文件名。

fileInfos[url]= parse_filename_from_responseHeader(resource) 

如果url是您想要下载的资源,请先尝试打开(url)。这将触发resiyrce.received事件,解析头并更新全局数组。

现在,在启动casper.download(url)之前,请查找fileInfos[url]

您会在fileInfos数组中找到与url对应的文件名。 如果需要,我可以详细说明解决方案,但是由于问题已经过了几年,所以我会等待下一步的阐述。

0

我会做的就是这样的事情,但我知道我要去的文件名获得:

this.waitForResource(function check(resource){ 
      res = resource;  
      // regular expression to test 
      return /thefilename/.test(resource.url); 
     }, function(){ 
      this.echo("Resource found: " + res.url); 
      // download the file 
      this.download(res.url, path); 
     }, null, 10000);