2015-05-08 31 views
4

我使用MVC 5網絡API控制器,我想返回一個文件:如何從web api控制器返回文件?

[Route("")] 
public HttpResponseMessage GetFile() 
{ 
    var statusCode = HttpStatusCode.OK; 
    FileStream file = XLGeneration.XLGeneration.getXLFileExigence(); 

    return Request.CreateResponse(statusCode, file); 
} 

它不到風度的工作。

從郵遞員例外情況是:

「ExceptionMessage」: 「在 'ObjectContent`1' 型未能序列化反應體內容類型 '應用/ JSON;字符集= UTF-8'」

+0

查看方法的定義,第二個參數是您試圖序列化的值。所以它試圖做的是序列化一個'FileStream',它可能不是可序列化的。嘗試將該文件讀入一個字符串並將該字符串用作第二個參數。 –

+0

可能相關:http://stackoverflow.com/questions/9541351/returning-binary-file-from-controller-in-asp-net-web-api – dbc

回答

2

嘗試......

[Route("")] 
public HttpResponseMessage GetFile() 
{ 
    var result = new HttpResponseMessage(HttpStatusCode.OK); 
    try 
    { 
     var file = XLGeneration.XLGeneration.getXLFileExigence(); 
     result.Content = new StreamContent(file); 
     result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); 
     var value = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
     value.FileName = "Whatever your filename is"; 
     result.Content.Headers.ContentDisposition = value; 
    } 
    catch (Exception ex) 
    { 
     // log your exception details here 
     result = new HttpResponseMessage(HttpStatusCode.InternalServerError); 
    } 
    return result; 
} 

這實際上應該流回來的文件。

+0

對不起,忽略了最低的工作。 – AtefB

+0

@AtefB我已經在生產中運行了近一年的代碼,唯一的區別是我正在將我的文件內容讀入一個字節數組,並創建一個MemoryStream來創建StreamContent。除此之外,它是從我的生產代碼中剪切和粘貼的。 – Kevin

+0

@AtefB有兩種可能性,爲什麼這可能不適合你。如果您的XLGeneration.XLGeneration.getXLFileExigence()實際上沒有返回流,或者您沒有用實際文件名替換「無論您的文件名是什麼」。 – Kevin

0

只是想法:

public HttpResponseMessage GetFile() 
{ 
    FileStream file = XLGeneration.XLGeneration.getXLFileExigence(); 

    using(var sr = new StreamReader(file)) 
    { 
     content = sr.ReadToEnd(); 

     return new HttpResponseMessage 
     { 
      Content = new StringContent(content, Encoding.UTF8, "application/json") 
     }; 
    } 
} 
+0

這會在發送之前將整個文件加載到內存中。 @Kevin的解決方案是可取的,因爲它直接發送流到客戶端。 –

+0

@Miroslav Exception @'using(var sr = new StreamReader(file))' 流不能播放 – AtefB

2

我張貼在什麼情況下,任何人都爲我工作作爲替代別人有困難。

[ActionName("File")] 
[HttpGet] 
public HttpResponseMessage File() 
{ 
     var response = new HttpResponseMessage(HttpStatusCode.OK); 
     var stream = new System.IO.FileStream(yourFilePath, System.IO.FileMode.Open); 
     response.Content = new StreamContent(stream); 
     response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); 

     return response; 
} 
+0

這也適用於我。 – etalon11

3

我從WebAPI控制器返回byte [],併成功下載PDF。 我正在使用iTextSharp(LGPL)4.1.6免費PDF轉換器。 要安裝iTextSharp(LGPL/MPL),請在軟件包管理器控制檯中運行以下命令。

安裝,包裝iTextSharp的,LGPL -Version 4.1.6

服務器端代碼

[Route("Export/ExportToPdf")] 

    public byte[] ExportToPdf(string html) 
    {   

     MemoryStream msOutput = new MemoryStream(); 
     TextReader reader = new StringReader(html); 
     Document document = new Document(new Rectangle(842, 595));    
     PdfWriter writer = PdfWriter.GetInstance(document, msOutput); 
     document.Open(); 
     document.HtmlStyleClass = @"<style>*{ font-size: 8pt; font-family:arial;}</style>"; 

     var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(html), null); 
     foreach (var htmlElement in parsedHtmlElements) 
     { 
      document.Add(htmlElement as IElement); 
     } 

     document.Close(); 

     return msOutput.ToArray(); 
    } 

客戶端代碼。

//Call this function inside of AJAX success. 
function ExportToPDF(data) { 

    //base64 To ArrayBuffer 
    var binaryString = window.atob(data); 
    var binaryLen = binaryString.length; 
    var bytes = new Uint8Array(binaryLen); 
    for (var i = 0; i < binaryLen; i++) { 
     var ascii = binaryString.charCodeAt(i); 
     bytes[i] = ascii; 
    } 
    //------- 

    var link = document.createElement('a'); 
    link.href = window.URL.createObjectURL(new Blob([bytes], { type: 'application/pdf' })); 
    link.download = "Report.pdf"; 
    link.click(); 
}