2017-03-07 95 views
2

我正在尝试使用.Net核心web api使用angular 2下载PDF(以及word,excel和image)文件。我在这里粘贴了一些代码示例,下载该文件,但是当我尝试打开下载的文件时,它会给我带来损坏的文件。使用angular 2和.net核心webapi下载PDF文件

这里是我的.NET的核心Web API代码

public HttpResponseMessage GetTestPdfFile() 
     { 
      var response = new HttpResponseMessage(HttpStatusCode.OK); 
      response.Content = new ByteArrayContent(myArray); //byte[] myArray is byte[] of file downloaded from Azure blob 
      //response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("inline"); 
      response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
      response.Content.Headers.ContentDisposition.FileName = myFileName; 
      response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf"); 
      return response; 
     } 

我也曾尝试另一个代码示例

public FileResult TestDownload(int id) 
     { 
      HttpContext.Response.ContentType = "application/pdf"; 
      FileContentResult result = new FileContentResult(myArray, "application/pdf") 
      { 
       FileDownloadName = "test.pdf" 
      }; 

      return result; 
     } 

这是我在角服务

getTestPdfFile(): Observable<any> { 
     let url = 'API_URL' 
     let headers1 = new Headers(); 
     headers1.append('Content-Type', 'application/pdf'); 
     headers1.append('responseType', 'arrayBuffer'); 

     return this.http.get(url, {headers: headers1}) 
      .map(res => { 
       var contentType = 'application/pdf'; 
       var blob = new Blob([res.arrayBuffer()], { type: contentType }); 
       return blob; 
      }) 
    } 

这我是如何订阅迷恋的

this.myService.getTestPdfFile() 
     .subscribe(blob => { 
       var link=document.createElement('a'); 
       link.href=window.URL.createObjectURL(blob); 
       link.download="Test.pdf"; 
       link.click(); 
      }, error => {}); 
    } 

回答

2

我从来没有运气使用observables下载物品。我所做的是使用window.open("http://urlToDocument.Test.pdf", "_blank")。这将下载或提示在新标签中下载文件。

+0

感谢。我发现了答案。 – Jay

2

我不得不改变我的角度服务于下方,所有工作得很好

getTestPdfFile(): Observable<any> { 
     let url = 'API_URL' 
     return this.http.get(url, { responseType: ResponseContentType.Blob }) 
         .map(res => res.blob()) 
         .catch(this.handleError) 
    } 

我用这作为我的web API

public FileResult TestDownload(int id) 
     { 
      HttpContext.Response.ContentType = "application/pdf"; 
      FileContentResult result = new FileContentResult(myArray, "application/pdf") 
      { 
       FileDownloadName = "test.pdf" 
      }; 

      return result; 
     } 
+0

谢谢,那就是诀窍。 – SHM