【问题标题】:How can I dynamically create and serve a file to a user (on click of a download button)? C#如何动态创建文件并将其提供给用户(单击下载按钮)? C#
【发布时间】:2015-11-10 20:02:36
【问题描述】:

在我的网站上,我有一个客户之前下的订单的列表,每个都可以查看。我试图让用户下载一个提供每个订单详细信息的文件,这样当他们在订单页面上单击“下载”时,他们将收到一个包含订单详细信息的文件。我有创建文件的代码,但我不知道如何提供它。到目前为止,这是我所拥有的:

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

【问题讨论】:

  • 请显示更多代码,您使用什么技术来托管这些文件、mvc、wcf、自定义服务?

标签: c# file download server system.io.file


【解决方案1】:

您可以将文件作为流从内存中返回。您不需要将其保存在服务器的文件系统中。您能否提供更多有关您使用哪种服务器技术的背景信息,以便我可以为您提供具体的代码。 在 MVC 中你可以这样做:

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

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

【讨论】:

    【解决方案2】:

    如果您使用默认的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 2011-09-05
      • 1970-01-01
      • 2011-05-01
      相关资源
      最近更新 更多