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

5

我希望在我的Web应用程序的代码后台文件中创建一个文本文件。然而,我不允许将此文件保存到服务器上。因此,我尝试使用MemoryStream类将我的文件保存到内存中。到目前为止,我的代码如下:

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

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

我该如何在ASP.Net中使用C#实现此功能。我搜索了很多但找不到适合我的解决方案。

提前致谢。


“在浏览器中打开”是什么意思?您提到了ASP.NET,这是否意味着您正在运行的内存流代码在ASP.NET中运行?如果是这样,您想要打开它的浏览器是用户的浏览器吗?如果是这种情况,您可以将其写入输出流。但是,如果您想要在服务器上弹出一个浏览器窗口并显示来自内存流的数据,恐怕我无法帮助您。 - Alxandr
是的,我想在客户端浏览器上打开文件。 - emre nevayeshirazi
你可以使用JavaScript来弹出窗口。使用memoryStream.Read()将变量转换为字符串,然后使用Response.Write()输出。 - PythEch
@Proton:JavaScript弹出窗口在这里有什么作用? - Alxandr
如果我知道他/她试图在客户端浏览器中打开什么...文本、图像、声音、二进制等等。这有点奇怪。 - PythEch
显示剩余2条评论
4个回答

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() 编写所有文本以构建该文件。
您可以进一步自定义 响应标头 以向浏览器提供更多信息。例如,如果您向 HttpResponse 添加以下标头:
Content-Disposition: attachment; filename=myfile.txt

然后浏览器会将其翻译为应该下载并保存此“文件”,而不仅仅是显示。(当然,用户的浏览器设置可能会告诉它仍然要显示它,但这是服务器向浏览器“建议”应该保存文件的正确方式。)
从浏览器的角度来看,“文件”来自哪里并不重要。无论它是来自服务器的文件系统、动态生成的还是神奇地产生的,都没有关系。浏览器只关心响应头和内容。如果头部说它是文本,并且它们说它是一个文件,那么内容将被视为文本文件。

3

为什么需要写入MemoryStream?如果您想将它发送到浏览器,请直接将其写入HTTP响应。

Response.WriteLine("Something");

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

他/她想在浏览器中打开某些东西很奇怪(我理解为客户端互联网浏览器)。这是什么意思?所以,你想要在你正在工作的页面上写什么,我说错了吗? - PythEch
是的,我希望客户在单击页面上的按钮时能够在他们的浏览器上看到 .txt 文件。但是,我不能使用 response.write(),因为这是要求使用 .txt 文件。(我知道这很傻) - emre nevayeshirazi
因此我无法提供帮助,因为我对ASP.NET了解不多。Python和PHP对我来说更好。 - PythEch

2

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

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

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


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

重点是,你应该将其分成两个不同的文件(或根据查询字符串分开操作)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接