我正在尝试写入内存中的文本文件,然后下载该文件而不将文件保存到硬盘。 我正在使用StringWriter来编写内容:

StringWriter oStringWriter = new StringWriter();
oStringWriter.Write("This is the content");

我如何下载此文件?

编辑:这是答案的组合,给了我我的解决方案。 这里是:

StringWriter oStringWriter = new StringWriter();
oStringWriter.WriteLine("Line 1");
Response.ContentType = "text/plain";

Response.AddHeader("content-disposition", "attachment;filename=" + string.Format("members-{0}.csv",string.Format("{0:ddMMyyyy}",DateTime.Today)));
Response.Clear();

using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8))
{
    writer.Write(oStringWriter.ToString());
}
Response.End();

#1楼 票数:17

这解决了我:

        MemoryStream ms = new MemoryStream();
        TextWriter tw = new StreamWriter(ms);
        tw.WriteLine("Line 1");
        tw.WriteLine("Line 2");
        tw.WriteLine("Line 3");
        tw.Flush();
        byte[] bytes = ms.ToArray();
        ms.Close();

        Response.Clear();
        Response.ContentType = "application/force-download";
        Response.AddHeader("content-disposition", "attachment;    filename=file.txt");
        Response.BinaryWrite(bytes);
        Response.End();     

#2楼 票数:15 已采纳

您可以直接将数据写入响应流,而不是将数据存储在内存中然后将其发送到响应流:

using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8)) {
  writer.Write("This is the content");
}

该示例使用UTF-8编码,如果您使用其他编码,则应更改该编码。

#3楼 票数:5

基本上,您通过实现IHttpHandler接口来创建HttpHandler。 ProcessRequest方法中,您基本上只需将文本写入context.Response 您还需要添加Content-Disposition http标头:

context.Response.AddHeader("Content-Disposition", "attachment; filename=YourFileName.txt");

还记得设置ContentType

context.Response.ContentType = "text/plain";

#4楼 票数:2

只是对其他答案的一小部分补充。 在下载的最后,我执行:

context.Response.Flush();
context.ApplicationInstance.CompleteRequest();

我了解到,否则,下载有时无法成功完成。

此Google网上论坛帖子还指出, Response.End会抛出一个ThreadAbortException ,您可以使用CompleteRequest方法避免这种情况。

#5楼 票数:0

我有很多问题。 Finnaly找到了一个似乎每次都有效的解决方案。

在大多数情况下,用户将单击下载按钮。 此时,最好将页面重定向回同一位置。 在您可以抓取和读取的网址中添加一个参数。

示例(www.somewhere.com/mypage.aspx?print=stuff)

    <asp:Button ID="btn" runat="server" Text="print something" OnClick="btn_Click" />


    protected void Page_Load(object sender, EventArgs e) {
        if (Request["print"] == "stuff") { Print("my test content"); }
    }

    /* or pass byte[] content*/
    private void Print(string content ){ 
        Response.ContentType = "text/plain";
        Response.AddHeader("content-disposition", "attachment;filename=myFile.txt");
        // Response.BinaryWrite(content);
        Response.Write(content);
        Response.Flush(); 
        Response.End();
    }

    protected void btn_Click(object sender, EventArgs e) {
        // postbacks give you troubles if using async.
        // Will give an error when Response.End() is called.
        Response.Redirect(Request.Url + "?print=queue");
    }

#6楼 票数:0

扩展@Vinicious回答。

我有可能包含逗号的数据。 常见的解决方案是通过将其括在引号中来逃避该数据,同时确保也可以转义也可能是数据一部分的引号。

我写的一篇文章和编写CSV时的警告,如果你在逗号上留下空格,excel就不会喜欢你了。 从超级用户的回答中发现我的问题的解决方案

protected void btnDownload_Click(object sender, EventArgs e)
{
    MemoryStream ms = new MemoryStream();
    TextWriter tw = new StreamWriter(ms, System.Text.Encoding.UTF8);
    var structures = KAWSLib.BusinessLayer.Structure.GetStructuresInService();
    // *** comma delimited
    tw.Write("Latitude, Longitude, CountySerial, StructureType, Orientation, District, RoutePre, RouteNo, LocationDesc");
    foreach (var s in structures)
    {
        tw.Write(Environment.NewLine + string.Format("{0:#.000000},{1:#.000000},{2},{3},{4},{5},{6},{7},{8}", s.LATITUDE, s.LONGITUDE, s.CO_SER, EscapeIfNeeded(s.SuperTypeLookup.SHORTDESC), EscapeIfNeeded(s.OrientationLookup.SHORTDESC), s.DISTRICT, s.ROUTE_PREFIX, s.RouteValue, EscapeIfNeeded(s.LOC_DESC)));
    }
    tw.Flush();
    byte[] bytes = ms.ToArray();
    ms.Close();

    Response.Clear();
    Response.ContentType = "application/force-download";
    Response.AddHeader("content-disposition", "attachment;    filename=" + string.Format("kaws-structures-{0:yyyy.MM.dd}.csv", DateTime.Today));
    Response.BinaryWrite(bytes);
    Response.End();
}

string EscapeIfNeeded(string s)
{
    if (s.Contains(","))
    {
        return "\"" + s.Replace("\"", "\"\"") + "\"";
    }
    else
    {
        return s;
    }
}

以下将导致excel问题。 在excel中,第一个引用将成为数据的一部分,因此在嵌入的逗号中分开。 空间不好。

 tw.Write(Environment.NewLine + string.Format("{0:#.000000}, {1:#.000000}, {2}, {3}, {4}, {5}, {6}, {7}, {8}", s.LATITUDE, s.LONGITUDE, s.CO_SER, EscapeIfNeeded(s.SuperTypeLookup.SHORTDESC), EscapeIfNeeded(s.OrientationLookup.SHORTDESC), s.DISTRICT, s.ROUTE_PREFIX, s.RouteValue, EscapeIfNeeded(s.LOC_DESC)));

#7楼 票数:-1

这很简单,答案可以在这篇Microsoft知识库文章中看到: 如何使用ASP.NET和C#将二进制文件写入浏览器

  ask by higgsy translate from so

未解决问题?本站智能推荐:

4回复

创建文件服务器上文件的下载链接

我正在寻找一种方法(轻松,优先;))创建一个单独的文件服务器上的文件的下载链接。 情况如下:我正在开发的应用程序(vb.net中的asp.net 2.0,但我在c#中有类似的问题,无论哪种解决方案适用于我)都将在公司内部运行。 好的做法是,文件存储和Web应用程序位于两个单独的服务器上。
3回复

从asp.net web api下载文件

我正在尝试从 asp.net web api 下载文件 (.docx)。 因为我已经在服务器中有一个文档,所以我设置了现有文档的路径,然后我按照 stackoverflow 上的一些内容进行操作并执行以下操作: docDestination 是我的路径。 在我的客户端之后,我尝试这样做:
1回复

无法从项目目录(asp.net)下载文件

这是我的问题。 我正在尝试从asp.net项目目录下载文件。 文件位于“日期”目录中。 我用GridView完成了WebForm1.aspx页面,该页面在Date目录中显示文件。 所有文件都显示为链接。 这是我的代码底部。 我通过文件链接。 之后,我的浏览器提供下载的不是我
6回复

使用asp.net下载文件

有一个数据文件和一些图像文件,我必须每天晚上使用asp.net下载到我们的本地服务器。 做这个的最好方式是什么? UPDATE 好的,在查看了回复之后,我看到我使用asp.net的初始帖子是一个糟糕的选择。 你会如何为C#中的控制台应用程序编写它。 我不确定我用什么类来连接和下
3回复

单击按钮上的ASP.NET Excel文件下载

作为前言,所有这些都发生在本地Intranet上,在任何时候都不需要连接到Internet。 我有一个运行查询的数据库,之后用户按下“下载电子表格”按钮,创建/发送电子表格。 电子表格的创建工作正常,但经过多次尝试后我无法下载该文件。 这是我尝试过的: 修改Response
4回复

从webservice下载文件 - 在ASP.NET站点中

我想使用webservice从一个网站将文件推送到浏览器。 我目前正在将文件读入base64字节数组,并从webservice返回。 这个web服务是从一个网站调用的,我一直坚持如何将其作为原始文件推送到浏览器。 理想情况下,我想将字节数组读入内存流,然后尽可能将其写入Response流,
3回复

文件名和mime问题-ASP.NET下载文件(C#)

我在ASP.NET应用程序中面临一个非常奇怪的问题。 当用户单击下载文件的按钮时,Internet Explorer / Chrome / Firefox将显示“保存”对话框,但是文件名是ASPX页面的名称 (例如,如果该页面名为Download.aspx,则显示下载对话框“文件” Dow
1回复

HTTP处理程序将文件限制为只读/仅查看,而不是可下载的C#ASP.NET WebPage

我有一个带有联机文件库的客户端。 她希望能够在表单库“ ReadOnly”中制作一些文件。 现在,当您查看文件库页面时,将显示所有文件。 当您单击文件时,它将打开标准浏览器窗口,并询问您是否要打开或下载文件。 基本上,她希望限制某些文件以仅允许您打开而不下载文件。 我很确定