Post Back does not work after writing files to response in ASP.NET

前端 未结 6 901
刺人心
刺人心 2020-12-15 15:00

What I have?

I have an ASP.NET page which allows the user to download file a on a button click. User can select the file he wants from

6条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-15 16:01

    Offhand, what you're doing should work. I've successfully done similar in the past, although I used a repeater and LinkButtons.

    The only thing I can see that's different is that you're using Response.Write() rather than Response.OutputStream.Write(), and that you're writing text rather than binary, but given the ContentType you specified, it shouldn't be a problem. Additionally, I call Response.ClearHeaders() before sending info, and Response.Flush() afterward (before my call to Response.End()).

    If it will help, here's a sanitized version of what works well for me:

    // called by click handler after obtaining the correct MyFileInfo class.
    private void DownloadFile(MyFileInfo file) 
    {
        Response.Clear();
        Response.ClearHeaders();
        Response.ContentType = "application/file";
        Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\"");
        Response.AddHeader("Content-Length", file.FileSize.ToString());
        Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length);
        Response.Flush();
        Response.End();        
    }
    

    You may want to consider transferring the file in a binary way, perhaps by calling System.Text.Encoding.ASCII.GetBytes(viewXml); and passing the result of that to Response.OutputStream.Write().

    Modifying your code slightly:

    protected void btnDownload_Click(object sender, EventArgs e)
    {
        string viewXml = exporter.Export();
        byte [] bytes = System.Text.Encoding.ASCII.GetBytes(viewXml); 
        // NOTE: you should use whatever encoding your XML file is set for.
        // Alternatives:
        // byte [] bytes = System.Text.Encoding.UTF7.GetBytes(viewXml);
        // byte [] bytes = System.Text.Encoding.UTF8.GetBytes(viewXml);
    
        Response.Clear();
        Response.ClearHeaders();
        Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
        Response.AddHeader("Content-Length", bytes.Length.ToString());
        Response.ContentType = "application/file";
        Response.OutputStream.Write(bytes, 0, bytes.Length);
        Response.Flush();
        Response.End();
    }
    

提交回复
热议问题