我正在尝试从文本框中创建一个csv文件,然后将其发送给用户。到目前为止,这是我的代码:
Response.Clear();
Response.ContentType = "text/csv";
Response.AppendHeader("Content-Disposition",
string.Format("attachment; filename={0}", DateTime.Now));
Response.Write(TextBox_Data.Text);
Context.Response.End();
发送的是一个空的xml文件,我之前从未尝试过使用文件进行响应,我想知道为什么会这样做?
我也尝试过以下哪些不起作用:
var writer = File.CreateText("C:\\file.csv");
writer.WriteLine(TextBox_Data.Text);
Context.Response.Clear();
Context.Response.AppendHeader("content-disposition", "attachment; filename=" + DateTime.Now + ".csv");
Context.Response.ContentType = "text/csv";
Context.Response.Write("C:\\file.csv");
Context.Response.Flush();
Context.Response.End();
如果您有答案,请告诉我们。)
答案 0 :(得分:7)
以下代码对我有用。您可能只是缺少文件扩展名。
Response.Clear();
Response.ContentType = "text/csv";
Response.AppendHeader("Content-Disposition",
string.Format("attachment; filename={0}.csv", DateTime.Now));
Response.Write(TextBox_Data.Text);
Context.Response.End();
答案 1 :(得分:2)
只是joshb关于使用Response.End()的答案的补充:
对于非错误情况,MSDN not recommend使用Response.End()
,在某些情况下,它实际上会导致客户端丢失一些数据。
在我的情况下,有时候下载的csv会丢失最后一行的最后一个字节,所以我删除了Response.End()
并使用了
HttpContext.Current.ApplicationInstance.CompleteRequest()
相反,我不得不重写页面的Render(HtmlTextWriter writer)
方法,不在请求上写任何内容,因为csv已经写入了。
public class PageBase : Page
{
private bool performRegularPageRender = true;
protected override void Render(HtmlTextWriter writer)
{
if (performRegularPageRender)
base.Render(writer);
}
public void SkipRegularPageRendering()
{
performRegularPageRender = false;
}
}
更多信息/点数: msdn blog; Is Response.End() considered harmful?; PostBack and Render Solutions? Overrides