我想在我的Web应用程序中的代码隐藏文件中创建一个Text文件。但是,我不允许将此文件保存到服务器。所以我尝试使用MemoryStream类将我的文件保存到内存中。到目前为止,我有,
MemoryStream memoryStream = new MemoryStream();
TextWriter textWriter = new StreamWriter(memoryStream);
textWriter.WriteLine("Something");
memoryStream.Close();
似乎工作正常,但我的要求是当他/她点击按钮时在客户端浏览器上打开此文件。由于此文件没有像.... / text.txt这样的物理路径。我不知道如何在浏览器上打开它。
如何使用C#在ASP.Net中执行此操作。我搜索了很多,但找不到适合我的解决方案。
提前致谢。
答案 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
关键是,您应该分成两个不同的文件(或基于查询字符串的单独操作)。