2014-01-31 47 views
1

我知道,我可以從一個控制器操作使用類似的代碼返回一個文件:流生成的文件到瀏覽器,而寫入文件系統

public ActionResult SomeAction() 
{ 
    return File(PathToTheFile); 
} 

還有一個接受流而不是文件路徑的過載。

就我而言,我動態創建一個基於數據庫查詢的CSV文件。將該CSV文件直接寫入響應並將響應視爲文件會更簡單。有可能這樣做嗎?怎麼樣?

編輯

我以爲我會寫某種流,但什麼流的種類和誰負責處​​置呢?

+0

那麼用戶不需要下載CSV文件?爲什麼要創建一個CSV文件(或任何文件)?只需查詢數據庫並顯示一個頁面(格式化你想要的方式) – rwisch45

+0

@ rwisch45對這些數據的用戶:文件必須被下載,我只是不希望它臨時寫入文件系統。 [從行動寫入輸出流]的 –

+0

可能重複(http://stackoverflow.com/questions/943122/writing-to-output-stream-from-action) –

回答

2

編輯:

正如你動態地創建輸出,並想避免創建文件和內存流,以提高性能和避免額外的I/O,一個簡單的辦法就是直接寫HTTP響應。以下代碼是適用於我的示例。您可以對數據使用相同的方法。

public ActionResult getFile() 
    { 
     Response.AddHeader("Content-Disposition", "attachment; filename=myVFile.csv"); 
     Response.ContentType = "text/csv"; 


     //sample data 
     string[] data = { "-4", "-3", "-2", "-1", "0", "1", "2", "3" }; 


     //Query data with LINQ - This can be done in diffrent ways 
     (from item in data 
     where 
      //Some conditions 
      item != "-4" 
     select 
     //Select whatever you want to be in the output 
     item 
     ) 
     .ToList() 
     .ForEach(
       //Write items from your LINQ Query to HTTP Response 
       item => Response.Write(item + ",") 
     ); 

     //You can use a foreach loop instead of chaining ForEach in LINQ as above 


     Response.End(); 

     return Content(null); 
    } 
+0

將如何CreateMyFile寫入流?什麼樣的流?流是如何處置的? –

+0

如果我要將文件傳輸到Response,我會使用MemoryString,如下所示: private static Stream CreateMyFile() { string filename =「myfile.csv」; byte [] content = File.ReadAllBytes(filename); MemoryStream ms = new MemoryStream(); ms.Write(content,0,(int)content.Length); ms.Position = 0; return ms; }你可以用'byte [] content = File.ReadAllBytes(filename)'來替換你的數據庫或者其他想要的內容。 – Maddy

+0

但是這需要a)在磁盤上有一個文件以避免這種情況); b)在將它們流出之前,將所有字節讀入內存。 –

相關問題