无法通过webapi在浏览器angularjs中显示文件

时间:2017-03-16 12:50:31

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

我正在尝试将从Web API返回的文件下载到angular客户端。问题是该文件没有打开,即pdf浏览器显示"无法加载"或者对于文本文件,在内容" undefined"。为清晰起见,请查看屏幕截图。

我从服务器返回HttpResponseMessage,response.Content包含从wcf服务返回的文件的MemoryStream

我不确定为什么它不起作用,我在这里尝试了一些建议并查看了其他一些文章。

我已将responseType设置为arraybuffer,尝试返回ByteArrayConentStreamContent

在UI中,尝试创建一个blob和文件,进一步调用window.URL.createObjectURL和window.open方法以及尝试window.location.href。

为了排除流有什么问题,在asp.net mvc app中测试返回的流,它返回并在浏览器中按预期打开文件。所以从wcf服务返回的流是可以的。

服务器

public HttpResponseMessage DownloadDocument(string filename)
        {
            var proxy = new WCFService();
            Stream fileStream = null;
            var storage = proxy.GetObject("param", "foo.txt", "param", out fileStream);

            if (fileStream != null)
            {
                var mstream = new MemoryStream();
                fileStream.CopyTo(mstream);
                var result = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    //Content = new StreamContent(mstream)
                    Content = new ByteArrayContent(mstream.ToArray())
                };

                result.Content.Headers.ContentLength = mstream.Length;
                result.Content.Headers.ContentType = new MediaTypeHeaderValue(storage.ContentType);
                result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachement")
                {
                    FileName = storage.FileName,
                    Size = mstream.Length
                };

                return result;
            }
            return new HttpResponseMessage(HttpStatusCode.NotFound);

        }

UI:

  $http.get('http://service/api/doc/downloaddoc?filename=null', { responseType: 'arraybuffer' })
      .success(function (data) {
         var contentType = 'application/pdf';
         var blob = new Blob([data], { type: contentType });
         var file = new File([blob], 'foo.pdf');
         var url = window.URL.createObjectURL(blob);
         window.open(url, 'f');

}

也尝试过:

 var reader = new FileReader();
 var out = new Blob([this.response], { type: contentType });
 reader.onload = function (e) {
    window.open(reader.result);
  }
  reader.readAsDataURL(out);

截图: TextFile

PDF

1 个答案:

答案 0 :(得分:0)

问题是,首先方法返回类型不应该是HttpResponseMessage而是我需要返回一个MemoryStream。

与HttpResponseMessage相关的另一个问题是,结果被包装在web api控制器中的ApiController.Ok()方法中。

所以从web api,我返回HttpResponseMessage。解决了它。