HTML 5锚标记下载不完整的文件?

时间:2016-02-23 15:02:11

标签: javascript c# angularjs google-chrome asp.net-web-api

我正在使用angular和ASP.NET Web API来允许用户下载在服务器上生成的文件。

下载链接的HTML标记:

 <img src="/content/images/table_excel.png">
 <a ng-click="exportToExcel(report.Id)">Excel Model</a>
 <a id="report_{{report.Id}}" target="_self"></a>

最后一个锚标记用作自动点击事件的占位符。可见锚调用exportToExcel方法来启动对服务器的调用并开始创建文件。

$scope.exportToExcel = function(reportId) {
    reportService.excelExport(reportId, function (result) {
        var url = "/files/report_" + reportId + "/" + result.data.Model.fileName;
        var dLink = document.getElementById("report_" + reportId);
        dLink.href = url;
        dLink.setAttribute('download', result.data.Model.fileName);
        dLink.click();
    });
}

Web API代码创建一个Excel文件。服务器上的文件大约是279k,但是当它在客户端上下载时只有7k。我的第一个想法是在文件完全写入之前可能会发生自动点击。因此,我在点击事件周围添加了10秒$timeout作为测试。它失败了同样的结果。

这似乎只发生在我们的远程QA服务器上。在我的本地开发服务器上,我总是得到整个文件。我不知道为什么会发生这种情况。我们具有类似的功能,其中文件从数据库blob构造并保存到本地磁盘以供下载。客户端下载采用相同的方法,似乎工作正常。我想知道是否有其他人遇到过类似的问题。

更新 在SilentTremmor评论之后,我们认为它实际上可能是IIS或某种Sever问题。最初,我们认为不可能,但经过一些挖掘后可能会。似乎客户端代码的实例仅允许下载7k的数据。无论我们尝试下载的结果总是一样的。

1 个答案:

答案 0 :(得分:0)

事实证明,API应用程序正在将文件写入我们应用程序的不同实例。客户端代码不知道并且正在尝试下载不存在的文件。因此,当下载链接创建文件时,它是空的,因此文件很小。