2016-10-03 59 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

相關問題