2014-11-06 83 views
0

我正在使用AngularJS并在iframe上设置ngSrc,我使用它来下载压缩存档以避免无法使用AJAX下载文件。我使用一个指令来检测iframe加载,我发现here,当你加载一个像“about:blank”这样的URL时,它工作的很好,但是当我用RESTful调用它下载文件,即使它下载生成的文件。当通过iframe下载文件时检测iframe加载

// Markup of iframe using ngSrc and custom directive 
<iframe ng-src="{{url}}" style="display:none;" iframe-onload="myCallback" /> 

// Controller setting iFrame, what I'd like to trigger the load 
$scope.downloadArchive = function(id) { // no load event? but downloads zip archive 

    var url = '/data/archive/instance/' + id; 
    $scope.url = $sce.trustAsResourceUrl(url); 
} 

// Controller setting iFrame, what does trigger the load 
$scope.downloadArchive = function(id) { // load event triggered 

    $scope.url = $sce.trustAsResourceUrl('about:blank'); 
} 

当通过iframe下载压缩归档文件时,是否可以检测到事件?

回答

0

是否由于浏览器限制无法通过AJAX下载文件?像跨域问题一样?您可以查看Chrome控制台中的错误。

如果是这种情况,由于现代浏览器的限制,您将无法在iframe中查看文件的内容。想想如果允许开发者访问任何iframe的内容会发生什么。我可以在你的银行网站的iframe中创建一个网站。登录后,我将能够从iframe中收听表单提交事件,然后获取您的登录凭据。

因此,可能发生的情况是,您的iframe正在加载该文件,试图在其中显示该文件,但是故意阻止您查看其内容的安全性。

我建议通过您自己的代理服务器或通过云服务下载文件,然后从您自己的服务器上提供文件。这可以避免跨域问题,因为您现在可以ping自己的服务器。

+0

该压缩文件实际上下载没有问题,但我没有办法检测是否它的iframe加载事件不会触发。需要知道它何时下载,因此我可以将iframes url重置为“about:blank”或其他,否则我无法根据需要下载该文件的第二个副本,需要首先将URL重置为其他内容。 – mtpultz 2014-11-06 06:30:09

0

我最终没有试图每次都重置URL,只是将当前时间作为第二个参数附加到服务器忽略的地方。现在看起来好像iframe正在重新加载一个新的URL。

var url = '/data/archive/instance/' + id + '/' + Date.now();