2012-02-14 110 views
5

在ASP.Net(与C#)我试图创建一个纯文本的.DAT文件,并将其发送到浏览器并强制下载。我尝试了几件事,但我无法得到它的工作。在我的aspx文件有一个ImageButton强制下载ASP.Net

<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。

我也试过它与内容类型的“应用程序/八位字节流”或与PDF文件和内容类型“应用程序/ pdf”,但没有任何作品。页面正常加载并且没有文件正在被下载。

+0

我怀疑响应的某些部分会在头部之前发送。我也不明白你期望单个响应如何下载文件,并同时使按钮不可见。 – CodesInChaos 2012-02-14 13:47:26

+0

我以为类似的东西,但我怎么做这项工作? – Yoni 2012-02-14 13:49:49

+1

作为旁注:查看'File.ReadAllBytes',它可以替换您用来读取文件的5行。你应该只用非常小的文件来做到这一点,或许高达10kB。 – CodesInChaos 2012-02-14 13:50:40

回答

3

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

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

它应该不是文件名吗?

为什么在将文件写入响应之前删除文件?通过响应提供文件并删除它是否更有意义?

即打电话

File.Delete(Server.MapPath(fileName)); 
的repsonse后

你应该尝试:

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

的TransmitFile是非常有效的,因为它基本上卸载到文件流媒体到IIS,包括可能导致在籽粒缓存获取缓存文件(基于IIS的缓存规则)。 Response.End();

+0

我尝试过不删除文件,但它也不起作用。在AddHeader方法中,只需填写文件的建议名称。所以不是完整的路径,而只是对文件名的建议。 – Yoni 2012-02-14 13:40:11

+0

你有没有试过Response.TransmitFile()?而不是BinaryWrite()? – Seany84 2012-02-14 13:44:53

+0

刚刚尝试过,但结果相同 – Yoni 2012-02-14 13:47:45

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();