使用FileResult返回瀏覽器文件及亂碼問題解決


一、向客戶端發送文件方法

Asp.Net 中返回文件方法

public void TxtFile(string filename)
{
    //html文件
    string path = @"E:\Win10桌面\" + filename;
    Response.ContentType = "text/xml";
    //直接輸出文件
    Response.TransmitFile(path);
}

MVC中返回文件方法

public FileResult TxtFile(string filename)
{
    //txt,html,xml文件
    string path = @"E:\Win10桌面\" + filename;

    string contentType = "text/plan";
    if (filename.Contains("html"))
        contentType = "text/html";
    else if (filename.Contains("xml"))
        contentType = "text/xml";
    //指定文件路徑 返回FilePathResult
    return File(path, contentType);
}

注意:很多時候返回html 文件在瀏覽器中顯示亂碼,原因是瀏覽器解析html文件默認使用utf-8編碼解析,然而有很多網頁的文件內容以及文件頭使用gb2312編碼,

解決方法是使用記事本

1.打開html源文件另存文件,選擇utf-8編碼,

2.修改html 文件頭 content-type類型 為utf-8

如果源代碼為:

<meta http-equiv="Content-type" content="text/html;" charset="gb2312" />

二、FileResult 介紹

1.

   FileResult是一個基於文件的ActionResult,利用FileResult我們可以很容易地將從某個物理文件的內容響應給客戶端。ASP.NET MVC定義了三個具體的FileResult,分別是FileContentResult、FilePathResult和FileStreamResult。

  針對文件的響應具有兩種形式,即內聯(Inline)和附件(Attachment)。一般來說,前者會利用瀏覽器直接打開響應的文件,而后者會以獨立的文件下載到客戶端。對於后者,我們一般會為下載的文件指定一個文件名,這個文件名可以通過FileResult的FileDownloadName屬性來指定。文件響應在默認情況下采用內聯的方式,如果需要采用附件的形式,需要為響應創建一個名稱為Content-Disposition的報頭,該報頭值的格式為“attachment; filename={ FileDownloadName }”。

2.

FileContentResult是針對文件內容創建的FileResult。如下面的代碼片斷所示,FileContentResult具有一個字節數組類型的只讀屬性FileContents表示響應文件的內容,該屬性在構造函數中指定。FileContentResult針對文件內容的響應實現也很簡單,從如下所示的WriteFile方法定義可以看出,它只是調用當前HttpResponse的OutputStream屬性的Write方法直接將表示文件內容的字節數組寫入響應輸出流。

3.

從名稱可以看出,FilePathResult是一個根據物理文件路徑創建FileResult。如下面的代碼片斷所示,表示響應文件的路徑通過只讀屬性FileName表示,該屬性在構造函數中被初始化。在實現的WriteFile方法中,FilePathResult直接將文件路徑作為參數調用當前HttpResponse的TransmitFile實現了針對文件內容的響應。抽象類Controller同樣定義了兩個File方法重載來根據文件路徑創建相應的FilePathResult。

4.

FileStreamResult允許我們通過一個用於讀取文件內容的流來創建FileResult。如下面的代碼片斷所示,讀取文件流通過只讀屬性FileStream表示,該屬性在構造函數中被初始化。在實現的WriteFile方法中,FileStreamResult通過指定的文件流讀取文件內容,並最終調用當前HttpResponse的OutputStream屬性的Write方法將讀取的內容寫入當前HTTP響應的輸出流中。抽象類Controller中同樣定義了兩個File方法重載根據文件讀取流創建相應的FileStreamResult。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM