如何生成txt文件然后强制下载ASP.NET Web窗体?

时间:2014-09-08 06:28:58

标签: c# asp.net

我需要将处理程序设置为<asp:Button>元素。当用户点击时,必须在代码隐藏中生成txt文件,并且必须由用户自动下载。无需从用户那里获取任何数据。所有文件内容都将在代码后面生成。例如,如何向用户返回包含此变量内容的txt文件:

string s = "Some text.\nSecond line.";

3 个答案:

答案 0 :(得分:4)

对于这种工作,你应该动态创建文件。 请参阅代码:

    protected void Button_Click(object sender, EventArgs e)
    {
        string s = "Some text.\r\nSecond line.";

        Response.Clear();
        Response.AddHeader("content-disposition", "attachment; filename=testfile.txt");
        Response.AddHeader("content-type", "text/plain");

        using (StreamWriter writer = new StreamWriter(Response.OutputStream))
        {
            writer.WriteLine(s);
        }
        Response.End();
    }
}

请注意新行,您需要使用\ r \ n而不是仅使用\ n或者为每行使用WriteLine函数

答案 1 :(得分:0)

您只需在服务器端生成文件,然后将其下推给用户即可。 s将是您将生成的文件的内容。

创建文件

创建新文件就像将数据写入其中一样简单,

// var s that you're having
File.Create(Server.MapPath("~/NewFile.txt")).Close();
File.WriteAllText(Server.MapPath("~/NewFile.txt"), s);

这将创建一个新文件(如果不存在)并将变量s的内容写入其中。

将其推送给用户

您可以使用以下代码

允许用户下载它
// Get the file path
var file = Server.MapPath("~/NewFile.txt");
// Append headers
Response.AppendHeader("content-disposition", "attachment; filename=NewFile.txt");
// Open/Save dialog
Response.ContentType = "application/octet-stream";
// Push it!
Response.TransmitFile(file);

这将让他拥有你刚创建的文件。

答案 2 :(得分:0)

我确实有一个类似的案例,但有点复杂的用例。

我确实会生成不同类型的文件。我写了一个容器类Attachment,它将内容类型和生成文件的值保存为Base64字符串。

public class Attachment {
   public string Name {get;set;}
   public string ContentType {get;set;}
   public string Base64 {get;set;}
}

这使我能够使用相同的下载方法提供不同的文件类型。

protected void DownloadDocumentButton_OnClick(object sender, EventArgs e) {
  ASPxButton button = (ASPxButton) sender;
  int attachmentId = Convert.ToInt32(button.CommandArgument);

  var attachment = mAttachmentService.GenerateAttachment(attachmentId);

  Response.Clear();
  Response.AddHeader("content-disposition", $"attachment; filename={attachment.Name}");
  Response.AddHeader("content-type", attachment.ContentType);
  Response.BinaryWrite(Convert.FromBase64String(attachment.Base64));
  Response.End();
}