我知道,我可以從一個控制器操作使用類似的代碼返回一個文件:流生成的文件到瀏覽器,而寫入文件系統
public ActionResult SomeAction()
{
return File(PathToTheFile);
}
還有一個接受流而不是文件路徑的過載。
就我而言,我動態創建一個基於數據庫查詢的CSV文件。將該CSV文件直接寫入響應並將響應視爲文件會更簡單。有可能這樣做嗎?怎麼樣?
編輯
我以爲我會寫某種流,但什麼流的種類和誰負責處置呢?
我知道,我可以從一個控制器操作使用類似的代碼返回一個文件:流生成的文件到瀏覽器,而寫入文件系統
public ActionResult SomeAction()
{
return File(PathToTheFile);
}
還有一個接受流而不是文件路徑的過載。
就我而言,我動態創建一個基於數據庫查詢的CSV文件。將該CSV文件直接寫入響應並將響應視爲文件會更簡單。有可能這樣做嗎?怎麼樣?
編輯
我以爲我會寫某種流,但什麼流的種類和誰負責處置呢?
編輯:
正如你動態地創建輸出,並想避免創建文件和內存流,以提高性能和避免額外的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);
}
將如何CreateMyFile寫入流?什麼樣的流?流是如何處置的? –
如果我要將文件傳輸到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
但是這需要a)在磁盤上有一個文件以避免這種情況); b)在將它們流出之前,將所有字節讀入內存。 –
那麼用戶不需要下載CSV文件?爲什麼要創建一個CSV文件(或任何文件)?只需查詢數據庫並顯示一個頁面(格式化你想要的方式) – rwisch45
@ rwisch45對這些數據的用戶:文件必須被下載,我只是不希望它臨時寫入文件系統。 [從行動寫入輸出流]的 –
可能重複(http://stackoverflow.com/questions/943122/writing-to-output-stream-from-action) –