如何动态创建文件并将其提供给用户(点击下载按钮)?C#

本文关键字:给用户 下载 按钮 动态 何动态 创建 文件 | 更新日期: 2023-09-27 18:21:20

在我的网站上,我有一个客户以前下的订单列表,每个订单都可以查看。我试图允许用户下载一个文件,提供每个订单的详细信息,这样当他们在订单页面上单击"下载"时,他们就会收到一个包含订单详细信息的文件。我有创建文件的代码,但我不知道如何提供它

var csv = new StringBuilder();  
csv.Append("Customer,Bill To Name,Ship To Name,Patient,Order#,Order Date,Line,Item#,Item Description,Qty,UOM,Price,Ext Price,Carrier,Notes,Purchase Order");
foreach (var cartLine in model.Lines) {
    var newLine = string.Format(.....)
    csv.AppendLine(newLine);
}
System.IO.File.AppendAllText(filepath, csv.ToString());

所以我的文件漂浮在服务器上,但我该怎么处理它呢?我也不希望这些文件永远挂在那里占用空间,我希望它们在客户端收到后立即从服务器上删除。

编辑:我正在使用MVC

如何动态创建文件并将其提供给用户(点击下载按钮)?C#

您可以将文件作为流从内存中返回。您不需要将其保存在服务器的文件系统中。你能提供更多关于你使用哪种服务器技术的上下文吗?这样我就可以给你具体的代码。在MVC中,您可以通过以下方式实现:

var bytes = Encoding.UTF8.GetBytes(csv.ToString());
return this.File(bytes, "text/csv")

Return File将内容作为字节数组或流和媒体类型,以告诉浏览器您要返回的文件类型。

如果您使用默认的asp.net堆栈(Controller/ApiController),请返回HttpResponseMessage。从csv字符串中获取流或其他内容,将Content属性设置为流;相应地更改内容类型标题,就完成了。

示例:

public HttpResponseMessage GetCsv()
{
    var csv = "whatever goes here";
    var stream = new MemoryStream(Encoding.UTF8.GetBytes(csv));
    var message = new HttpResponseMessage()
    {
        Content = new StreamContent(stream)
    };
    message.Headers.Add("Content-type", "text/csv");
    return message;
}