如何在浏览器中打开MemoryStream文件?

时间:2011-08-24 10:23:29

标签: c# asp.net memorystream

我想在我的Web应用程序中的代码隐藏文件中创建一个Text文件。但是,我不允许将此文件保存到服务器。所以我尝试使用MemoryStream类将我的文件保存到内存中。到目前为止,我有,

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

似乎工作正常,但我的要求是当他/她点击按钮时在客户端浏览器上打开此文件。由于此文件没有像.... / text.txt这样的物理路径。我不知道如何在浏览器上打开它。

如何使用C#在ASP.Net中执行此操作。我搜索了很多,但找不到适合我的解决方案。

提前致谢。

4 个答案:

答案 0 :(得分: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");

这将向浏览器发送纯文本,仅此而已。浏览器不会认为它是一个网页或类似的东西,不会对它应用任何样式等。就Web浏览器而言,它只是下载了一个文本文件,其中包含“Hello World”字样。您可以Response.Write()要构建该文件的所有文本。

您可以进一步自定义response headers,为浏览器提供更多信息。例如,如果您将以下标题添加到HttpResponse

Content-Disposition: attachment; filename=myfile.txt

然后浏览器会将其翻译为意味着应该下载并保存此“文件”,而不仅仅是显示。 (当然,用户的浏览器设置可能会告诉它显示它,但这是服务器向浏览器“建议”应该保存文件的正确方法。)

从浏览器的角度来看,“文件”的来源并不重要。无论是来自服务器的文件系统还是动态生成或神奇地变形,它都没有区别。浏览器仅关注响应标头和内容。如果标题说它是文本,并且他们说它是文件,那么内容将被视为文本文件。

答案 1 :(得分:3)

为什么需要编写MemoryStream?如果要将其发送到浏览器,只需将其写入HTTP响应即可。

Response.WriteLine("Something");

如果您想让浏览器将此响应下载为文件see here

答案 2 :(得分:2)

我真的相信这不是Web开发中的好模式。

只是读取文件并将其数据作为文本发送到客户端(Web浏览器),在文本框中编辑,发回修改后的文本并将其作为文件保存在您选择的路径或存储中。 / p>

HTTP是一种无状态协议,因此您不会在服务器端打开文件而在客户端编辑其内容,因为在服务器响应结束后,这两个层都会完全断开连接。

答案 3 :(得分: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

关键是,您应该分成两个不同的文件(或基于查询字符串的单独操作)。