允许用户下载文件 - ASP.NET

时间:2009-12-27 20:39:33

标签: c# .net asp.net

我有一个创建音频文件的应用程序。当需要用户保存文件时,我需要提供一个链接来显示保存对话框。

我将下载按钮设置为链接按钮。从我的研究看来,为了能够强制启动保存对话框,我需要添加以下代码:

Response.ContentType = "audio/wav";
Response.AppendHeader("Content-Disposition", "attachment; filename=blah.wav");
Response.WriteFile(@"blah.wav");
Response.End();

当我将此添加到链接按钮的事件处理程序时,我收到错误:

"Line: 4723
Error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.
Details: Error parsing near 'RIFF?WAVEfmt '."

所以,我决定通过创建一个便于下载的中间页面来试用它。在下载linkbutton事件处理程序中,我向此中间页面添加了Respose.Redirect,并在页面的Page_Load上添加了上面的代码段。当以这种方式设置时,IE会阻止下载:

"To help protect your security, Internet Explorer blocked his site from downloading files to your computer. Click here for options"当我点击并选择“下载文件”时,我没有收到“保存”对话框。

我的问题: 1.我可以删除中间页面吗? 2.如果我不能怎么没有IE提示用户采取行动?

4 个答案:

答案 0 :(得分:1)

也许您的Response在点击代码之前包含了某些内容,在输出任何内容之前是否尝试了Response.Clear()

此外,Response.Write之后不应该有Response.End()

这将解决第一个错误,并且不需要中间页面。

我之前已经这样做过,所以我没有看到限制。

尝试找到正在修改Response

的内容

由于

答案 1 :(得分:1)

Response.Clear();
            Response.ContentType = "audio/x-wav";
            Response.AddHeader("Content-Disposition", "attachment;filename=blah.wav");
            Response.WriteFile(@"blah.wav");
            Response.Flush();
            Response.End();

我相信你错过了两个部分,Clear()和Flush()。

我以前使用过这个确切的代码。

作为注释,您可能需要使用Response.BinaryWrite而不是Response.WriteFile。

答案 2 :(得分:1)

protected void Button1_Click(object sender, EventArgs e)
{
    String FileName1 = "test.mp3";

    String FilePath1 = "~/audio/test.mp3";


    String FileName = "FileName1";
    String FilePath = FilePath1;
    System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
    response.ClearContent();
    response.Clear();
    response.ContentType = "text/plain";
    response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
    response.TransmitFile(FilePath);
    response.Flush();
    response.End();
}
<asp:Button ID="Button1" runat="server" Text="DownLoad" 
        onclick="Button1_Click" />

答案 3 :(得分:0)

只是一个猜测,但您的问题可能是由于服务器上未设置某些MIME类型。