2011-08-24 53 views
4

我想在我的web應用程序的文件後面的代碼中創建一個文本文件。但是,我不允許將此文件保存到服務器。所以我嘗試使用MemoryStream類將我的文件保存到內存中。到目前爲止,我有,如何在瀏覽器中打開MemoryStream文件?

MemoryStream memoryStream = new MemoryStream(); 
TextWriter textWriter  = new StreamWriter(memoryStream); 
textWriter.WriteLine("Something"); 
memoryStream.Close(); 

這似乎是工作,但我的要求是要打開這個文件在客戶端瀏覽器時,他/她點擊按鈕。由於該文件沒有像..../text.txt這樣的物理路徑。我不知道如何在瀏覽器上打開它。

如何在使用C#的ASP.Net中執行此操作。我搜索了很多,但無法找到適合我的解決方案。

在此先感謝。

+0

你是什麼意思「在瀏覽器中打開」?你提到ASP.NET,這是否意味着你正在運行的內存流代碼在ASP.NET中運行?如果是這樣,您想要在用戶瀏覽器中打開它的瀏覽器是什麼?如果是這種情況,您可以將它寫入輸出流。但是,如果您想在服務器上彈出瀏覽器窗口並顯示來自內存流的數據,恐怕我無法幫助您。 – Alxandr

+0

是的,我想打開客戶端瀏覽器上的文件。 –

+0

您可以使用JavaScript彈出。使用memoryStream.Read()來創建一個變量字符串,然後使用Response.Write()。 – PythEch

回答

5

這比您想象的要容易得多。請記住,HTTP協議實際上並沒有以最嚴格的意義傳輸「文件」。它傳輸請求和響應,每個請求和響應包含標題和內容。在這種情況下,你關心響應的標題和內容。

在WebForms應用程序中執行此操作的最簡單方法是使用generic handler。具體來說,看看在鏈接處理程序的響應執行:

context.Response.ContentType = "image/png"; 
context.Response.WriteFile("~/Flower1.png"); 

這是適當地設置響應的頭之後寫入圖像文件的響應內容。你想要的更接近於實現中註釋的內容:

context.Response.ContentType = "text/plain"; 
context.Response.Write("Hello World"); 

這將發送給瀏覽器純文本,僅此而已。瀏覽器不會認爲它是一個網頁或類似的東西,不會應用任何樣式,等等。就網絡瀏覽器而言,它只是下載了一個文本文件,其中包含文字「Hello World」 。你可以Response.Write()你想要建立該文件的所有文本。

您可以進一步自定義您的response headers,爲瀏覽器提供更多信息。例如,如果下面的標題添加到您的HttpResponse

Content-Disposition: attachment; filename=myfile.txt 

那麼瀏覽器就會把這一意思,這個「文件」應該可以下載並保存,而不僅僅是顯示。 (當然,用戶的瀏覽器設置可能會告訴它顯示它,但這是服務器向瀏覽器「建議」它應該保存該文件的正確方式。)

從角度來看瀏覽器,「文件」來自何處並不重要。無論是來自服務器的文件系統,還是動態生成或魔術變形,都沒有區別。瀏覽器只關心響應標題和內容。如果標題說它是文本,並且他們說它是一個文件,那麼內容將被視爲一個文本文件。

+0

thx偉大的回答。 –

2

我真的相信這不是Web開發中的一個好模式。

它只是讀取文件並將其數據作爲文本發送到客戶端(Web瀏覽器),在文本框中進行編輯,發回修改的文本並將其保存爲文件,並將其保存爲您選擇的路徑或存儲。

HTTP是一種無狀態協議,所以在服務器端編輯它的內容時,您不會在服務器端打開文件,因爲在服務器響應結束後,兩個層都絕對斷開連接。

3

爲什麼你需要寫一個MemoryStream?如果您想將它發送到瀏覽器,只需將它寫入HTTP響應。

Response.WriteLine("Something"); 

如果你想在瀏覽器下載此響應爲一個文件,see here

+0

奇怪的是,他/她想在瀏覽器中打開某些東西(我瞭解客戶端瀏覽器)。這是什麼意思?所以,把你想要的東西寫到你正在工作的頁面上,我說錯了嗎? – PythEch

+0

是的,我希望客戶在頁面上點擊按鈕時在其瀏覽器上看到.txt文件。但是,我無法使用response.write(),.txt文件是必需的。 (我知道這很愚蠢) –

+0

因此我忍不住,因爲我對ASP.NET不太瞭解。 Python和PHP對我來說更好。 – PythEch

1

好吧,我想我想出你想要什麼。你說你有一個按鈕,你想要去一個文本文件的內容,你想創建內存中,但你不知道當用戶單擊按鈕時,瀏覽器要發送到哪個url ?

如果是這樣這裏的情況是你可以做什麼:

1) On the page that has the button, set the href (or link-location or whatever) of the button to be a new asp.net page (jet to be created). Something like "textfile.aspx" or whatever. Also, remove all the code regarding the memory-stream. 
2) Create the new asp.net file (textfile.aspx, or whatever you decided to call it). The content of that file should be like this: 

Response.WriteLine("Something"); // Or whatever you previously wrote to the MemoryStream 

的一點是,你應該分成兩個不同的文件(或單獨行動基於查詢字符串)。

相關問題