C# Asp.net如何向客户端写入文件

30

希望这是个简单问题。我需要编写一些报告,然后让用户提示将其保存到本地计算机。上次我这样做时,我在 Web 服务器上编写了一个文件,然后通过 Response 对象将它发送给客户端。

在 Web 服务器上创建

            TextWriter tw = new StreamWriter(filePath);

发送给客户端

           page.Response.WriteFile(path);

问题是,有没有一种方法可以跳过将物理文件写入Web服务器,并直接从表示文档的对象到响应?

4个回答

28
您可以像这样使用 Response.ContentType。
Response.ContentType = "text/plain";
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.AddHeader("Content-Disposition", "attachment;filename=yourfile.txt");

当然,如果你想写一个文本文件,这种方法是可行的。但是,如果你想写一个.doc文件,你需要将ContentType更改为"application/msword"等...


这段代码将结果写入我的浏览器,没有提示。IReport rpt = new ContxReport(); string report = rpt.makeReport(); ASCIIEncoding encoding = new ASCIIEncoding(); byte[] encodedReport = encoding.GetBytes(report); Response.ContentType = "text/plain"; Response.OutputStream.Write(encodedReport, 0, encodedReport.Length); Response.AddHeader("Content-Disposition", "inline;filename=shit.csv"); Response.End(); - jim
1
此外,在写入之前,您应该设置所有的头部信息。 - Talljoe
2
什么是缓冲区? - Kiquenet
1
在这个特定的例子中,“buffer”只是一个字节数组的变量名,即byte[] buffer; 或许不是最好的命名方式,因为它可能会引起混淆。然而,在2009年我写下这个答案时,我想我是从实际代码中复制/粘贴过来的。 - Nikos Steiakakis

17
你可以尝试这个:
试一下这个:
Table oTable = new Table();
//Add data to table.

Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment;filename="test.xls"");
Response.Charset = "";
this.EnableViewState = false;
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.Html32TextWriter oHtmlTextWriter = new System.Web.UI.Html32TextWriter(oStringWriter);
0Table.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.End();

这将提示用户打开或保存test.xls文件。类似地,您可以在Table的位置提供其他ASP.NET对象。


您应该可以使用Response.Output而不是创建一个StringWriter。 - Talljoe
我有两个问题。1)那个文件是否支持断点续传?2)如果使用像IDM之类的下载管理器,是否可以建立多个连接? - shashwat
2
@ShashwatTripathi 我不确定。这是我很久以前用过的一段代码。在我看来,它不支持恢复或多个下载连接。 - Ganesh R.

5
是的。
page.Response.WriteFile(yourData, 0, yourData.Length);

1
我有两个问题。1)那个文件是否支持断点续传?2)如果使用下载管理器(如IDM等),是否可以进行多个连接? - shashwat

5
这个问题的确切答案取决于你的报告如何组织(即你所指的“对象”是什么)。如果你有一个单一的字符串,你可以使用Response.Write来写入它。如果你需要一个TextWriter,那么Response.Output就是你想要的——这样你就可以跳过将内容写入磁盘,然后再使用WriteFile的步骤。此外,如果你的内容恰好是二进制的,你可以使用Response.OutputStream。
如果你希望用户看到保存文件对话框,你还可以设置Response.AddHeader("Content-Disposition", "attachment")。但是,Content-Disposition并不一定会被遵守,因此用户可能仍然会直接在浏览器中打开报告。记得在输出实际内容之前设置头部!
另外,根据报告的格式,你可能希望将Response.ContentType设置为适当的内容类型,比如text/plain、text/csv等等。正确的MIME类型列在IANA网站上。

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