【发布时间】:2016-02-23 15:02:11
【问题描述】:
我正在使用 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。我的第一个想法是在文件完全写入之前可能会发生自动点击。因此,我在 click 事件周围添加了 10 秒 $timeout 作为测试。它失败了,结果相同。
这似乎只发生在我们的远程 QA 服务器上。在我的本地开发服务器上,我总是取回整个文件。我不知道为什么会发生这种情况。我们有类似的功能,文件从数据库 blob 构建并保存到本地磁盘以供下载。客户端下载采用相同的方法,并且似乎工作正常。我想知道是否有其他人遇到过类似的问题。
更新 在 SilentTremmor 发表评论后,我们认为它实际上可能是 IIS 或某种服务器问题。最初,我们认为它不可能,但经过一番挖掘,它可能是。客户端代码的实例似乎只允许下载 7k 的数据。不管我们尝试下载什么结果总是一样的。
【问题讨论】:
-
检查你的服务器设置或代码iis.net/configreference/system.webserver/asp/limits 但据我了解,如果文件生成正确(你可以用excel打开它)你可能会遇到另一个问题,在文件系统中你可能有类似名称的文件。
-
@SilentTremor,我认为这不是 IIS 问题,因为就像我说的那样,我们将 DB blob 文件写入同一个目录,并且下载都很好。你是对的,文件正在服务器上创建,我可以打开它。出于某种原因,我只取回了 295k 文件中的 7k。不过,我很感谢您的回复
标签: javascript c# angularjs google-chrome asp.net-web-api