2017-03-16 73 views
1

我想下载从Web API返回到角客户端的文件。问题在于文件未打开,即PDF浏览器显示“未能加载”或文本文件在“未定义”内容中。为清晰起见,请查看屏幕截图。无法通过webapi在浏览器angularjs中显示文件

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

我不知道为什么它不起作用,我已经尝试了一些在这里建议的事情,并看了一些其他文章。

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

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

为了排除流是否有问题,在asp.net mvc应用程序中测试了返回的流,并返回并在浏览器中按预期打开文件。所以从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

+0

为什么不简单地做'window.open(“http:// service/api/doc/downloaddoc?filename = null”)? –

+0

我该如何传递无记名标记?使用初始令牌授权 – Haris

+0

通过GET参数。 –

回答

0

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

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

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