强制下载ASP.Net

时间:2012-02-14 13:30:04

标签: c# asp.net webforms download

在ASP.Net(使用C#)中,我正在尝试创建一个带有纯文本的.DAT文件,并将其发送到浏览器并强行下载。我尝试了几件事,但我无法让它发挥作用。在我的aspx文件中有一个ImageButton

<asp:ImageButton ID="btnSave" runat="server" CausesValidation="False" ImageUrl="~/Images/Stages/Database/Save.png" OnClick="btnSave_OnClick" Width="26px" />

在OnClick方法中,我正在尝试创建文件并将其发送到浏览器。

protected void btnSave_OnClick(object sender, EventArgs e)
{
    string file = "test.dat";
    string fileName = "~\\Stages\\Broekx\\Databanken\\" + file;

    FileStream fs = new FileStream(MapPath(fileName), FileMode.Open);
    long cntBytes = new FileInfo(MapPath(fileName)).Length;
    byte[] byteArray = new byte[Convert.ToInt32(cntBytes)];
    fs.Read(byteArray, 0, Convert.ToInt32(cntBytes));
    fs.Close();

    ImageButton btnSave = (ImageButton)FormViewStagesDummy.FindControl("btnSave");
    btnSave.Visible = false;

    File.Delete(Server.MapPath(fileName));

    if (byteArray != null)
    {
        this.Response.Clear();
        this.Response.ContentType = "text/plain";
        this.Response.AddHeader("content-disposition", "attachment;filename=" + file);
        this.Response.BinaryWrite(byteArray);
        this.Response.End();
        this.Response.Flush();
        this.Response.Close();
    }
}

文件test.dat存在于正确的文件夹中,在读入字节后必须删除。我在没有删除文件的情况下尝试了这个并且也无法正常工作。

单击btnSave后,必须隐藏按钮,这就是我将参数Visible设置为false的原因。

我也尝试使用内容类型“application / octet-stream”或PDF文件和内容类型“application / pdf”,但没有任何效果。页面正常加载,没有下载文件。

2 个答案:

答案 0 :(得分:3)

文件字符串的路径实际上是否正确?

this.Response.AddHeader("content-disposition", "attachment;filename=" + file);

它不应该是文件名吗?

为什么要在将文件写入响应之前删除该文件?通过响应提供文件然后将其删除会更有意义吗?

即。致电

File.Delete(Server.MapPath(fileName));

在回复之后。

你应该尝试:

Response.TransmitFile( Server.MapPath(fileName) );
Response.End();

TransmitFile非常有效,因为它基本上将文件流卸载到IIS,包括可能导致文件缓存在Kernal缓存中(基于IIS的缓存规则)。     到Response.End();

答案 1 :(得分:0)

                Response.Clear();
                Response.ClearContent();
                Response.ClearHeaders();
                Response.ContentType = "text/plain";
                Response.AppendHeader("Content-Disposition", "attachment; filename = " + fileName);
                Response.TransmitFile(Server.MapPath("~/foldername/" + fileName));
                Response.End();