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

本文关键字:MemoryStream 文件 浏览器 | 更新日期: 2023-09-27 18:06:35

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

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

这似乎是工作,但我的要求是打开这个文件在客户端浏览器当他/她点击按钮。因为这个文件没有像..../text.txt这样的物理路径。我不知道怎么在浏览器上打开它

如何在ASP中做到这一点?Net使用c#。我找了很多,但没有找到适合我的解决方案。

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

这比您想象的要简单得多。请记住,HTTP协议实际上并不传输严格意义上的"文件"。它传输请求和响应,每个请求和响应都包含标头和内容。在本例中,您关心的是响应的报头和内容。

在WebForms应用程序中,最简单的方法是使用通用处理程序。具体来说,看一下该链接中处理程序响应的实现:
context.Response.ContentType = "image/png";
context.Response.WriteFile("~/Flower1.png");

这是在适当设置响应头后将图像文件的内容写入响应。你想要的更接近于在实现中被注释掉的内容:

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

这将向浏览器发送纯文本,仅此而已。浏览器不会认为这是一个网页或类似的东西,不会给它应用任何样式,等等。就网络浏览器而言,它只是下载了一个带有"Hello World"字样的文本文件。你可以Response.Write()所有你想要构建文件的文本。

你可以进一步定制你的响应头给浏览器更多的信息。例如,如果你在HttpResponse中添加以下header:

Content-Disposition: attachment; filename=myfile.txt

那么浏览器会把它翻译成这个"文件"应该被下载并保存,而不仅仅是显示。(当然,用户的浏览器设置可能会告诉它无论如何都要显示它,但这是服务器"建议"浏览器保存文件的正确方式。)

从浏览器的角度来看,"文件"来自哪里并不重要。无论它是来自服务器的文件系统,还是动态生成的,还是神奇地变出来的,都没有区别。浏览器只关心响应头和内容。如果标题说它是文本,并且它是一个文件,那么内容将被视为文本文件。

为什么你需要写一个MemoryStream?如果你想把它发送到浏览器,就把它写在HTTP响应中。

Response.WriteLine("Something");

如果您想让浏览器将此响应作为文件下载,请参见这里。

我真的认为这不是一个好的Web开发模式。

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

HTTP是一种无状态协议,所以你不会在服务器端打开一个文件,而在客户端编辑它的内容,因为在服务器响应结束后,这两层是绝对断开的。

好的,我想我知道你想要什么了。比方说,你有一个按钮,你想在内存中创建一个文本文件的内容,但是你不知道当用户单击这个按钮时要把浏览器发送到哪个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
关键是,您应该将其分成两个不同的文件(或基于查询字符串的单独操作)。