2016-10-03 73 views
2

我已经编写了一个程序来下载web api返回的pdf,word或txt文件,它工作正常。在服务器端,我使用了WebApi和客户端AngularJs。现在的问题是,我也需要api的文件名,为此我需要读取api返回的头文件。但是reponse.headers不包含所有标题信息。下面是我的代码:无法将自定义标头从WebAPI公开给客户端

[HttpGet] 
[Authorize] 
    public HttpResponseMessage GetTranscript(string key, int format) 
    { 
     var badRequest = Request.CreateResponse(HttpStatusCode.OK, "Not a valid input."); //ResponseMessage(Request.CreateResponse(HttpStatusCode.BadRequest, "Not a valid input.")); 
     if (string.IsNullOrWhiteSpace(jiraTaskKey)) 
     { 
      return badRequest; 
     } 

     string transcript = _mediaCaptionService.GetTranscript(UserId, key); 

     string fileName = "transcript"; 
     var response = new HttpResponseMessage(HttpStatusCode.OK); 

     if (format == (int)TranscriptFormat.PDF) 
     { 
      byte[] byteInfo = GeneratePDFTranscript(transcript); 
      response.Content = new ByteArrayContent(byteInfo); 
      response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
      fileName = fileName + ".pdf"; 
     } 
     else if (format == (int)TranscriptFormat.TXT) 
     { 
      response.Content = new StringContent(transcript, System.Text.Encoding.UTF8, "text/plain"); 
      fileName = fileName + ".txt"; 
     } 
     else if (format == (int)TranscriptFormat.WORD) 
     {     
      string transcriptFontName = "Arial"; 
      byte[] byteInfo = GenerateWordTranscript(transcript, transcriptFontName); 
      response.Content = new ByteArrayContent(byteInfo); 
      response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
      fileName = fileName + ".doc"; 
     } 
     else 
     { 
      return badRequest; 
     } 
     response.Content.Headers.Add("x-filename", fileName); 
     response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { 
      FileName = fileName 
     }; 
     //response.Content.Headers.ContentDisposition.FileName = fileName; 
     return response; //ResponseMessage(response); 
    }  

,并在客户端

function getTranscriptResult(method, apiUrl, data) { 
     var deferred = $q.defer(); 
     $http({ 
      method: method, 
      url: apiUrl, 
      data: data, 
      responseType: 'arraybuffer' 

     }).success(function (data, status, headers, config) { 
      debugger; 
      var results = []; 
      results.data = data; 
      results.headers = headers(); 
      results.status = status; 
      results.config = config;     
      deferred.resolve(results); 

     }).error(function (error, status, headers, config) { 
      deferred.reject(error); 

     }); 
     return deferred.promise; 
    } 

但是,当我把上面的代码中的断点,我得到这个:

enter image description here

能否请您告诉我我的代码中的问题在哪里,我无法获取文件名?如果您需要更多信息,请让我知道。

+0

只需注意:这与Chrome无关。如果您直接在Chrome中使用该服务的URI,则会注意到它会下载该文件,并使用正确的文件名。认为你应该将你的标题从“Google Chrome ...”改为“Angular ...” – Michael

回答

9

添加下面的行后解决了我的问题。

// Add a custom header for filename and expose it to be consumed by JavaScript. 
response.Content.Headers.Add("Filename", zipFileName); 
response.Content.Headers.Add("Access-Control-Expose-Headers", "Filename"); 

所以基本上增加访问控制展露报头帮我自定义首暴露于客户端。欲了解更多信息,请点击这里link

+0

哇。只是哇。这是没有用的。 – zeroflaw