从web api控制器向角度js提供文件

时间:2017-07-24 19:17:10

标签: c# .net angularjs

所以我有一个pdf,我使用PDF Sharp生成并保存在我的App_Data文件夹中。当用户单击我的控制器上的按钮时,我希望用户能够下载该文件。

我设法让用户可以下载文件(有点),但是当他们打开这个pdf文件时,文档是空白的,看起来几乎是原始文件的两倍文件保存在我的App_Data文件夹中。我不确定出了什么问题,但只能猜测它与我如何阅读文件和传输数据有关。

无论如何这是web api控制器功能:

[HttpGet]
public HttpResponseMessage DownloadPdf(int itemId)
{
    var item = _myService.GetItem(itemId);
    var result = Request.CreateResponse(HttpStatusCode.OK);

    result.Content = new StreamContent(File.ReadAllBytes(HostingEnvironment.MapPath(item.ReportFilePath)));
    result.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/pdf");
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    result.Content.Headers.ContentDisposition.FileName = Path.GetFileName(HostingEnvironment.MapPath(item.ReportFilePath));

    return result;
}

这是我的角度控制器上的相关功能(请注意,businessResource调用只是通过$ http调用将数据路由到我的web api函数):

$scope.downloadPdf = function() {
    businessResource.downloadPdf($scope.itemId).then(function (response) {
        var headers = response.headers;
        var filename;
        var disposition = headers('Content-Disposition');
        if (disposition && disposition.indexOf('attachment') !== -1) {
            var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
            var matches = filenameRegex.exec(disposition);
            if (matches != null && matches[1]) {
                filename = matches[1].replace(/['"]/g, '');
            }
        }

        // Get the blob url creator
        var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
                if (urlCreator) {
                    var link = document.createElement('a');

                    if ('download' in link) {

                        // Prepare a blob URL
                        var blob = new Blob([response.data], { type: headers('content-type') });
                        var url = urlCreator.createObjectURL(blob);
                        link.setAttribute('href', url);
                        link.setAttribute("download", filename);

                        // Simulate clicking the download link
                        var event = document.createEvent('MouseEvents');
                        event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
                        link.dispatchEvent(event);

                    }
                }
            }, function (response) {
                notificationsService.error("Error", "Could not generate report");
            });
        }

所以只是为了澄清:这个调用工作的意义是我正在下载一个pdf文件,但是当我在浏览器/ pdf阅读器中打开它时,这个文件似乎不包含任何内容,几乎是原始文件我存储在App_Data文件夹中。

我不知道数据在哪里被破坏了......有什么想法吗?

1 个答案:

答案 0 :(得分:0)

想出来:

调用web api的$ http.get需要更改:

return $http.get('<end point url>);

为:

return $http.get('<end point url>', { responseType: 'arraybuffer' });

即。 responseType需要设置为&#39; arraybuffer&#39;。希望这有助于某人!