ASP.Net传输文件

时间:2011-10-17 16:22:19

标签: asp.net download transmitfile

我正在ASP.net中编写一个web应用程序。

我正在尝试创建一个文件对话框,用于从服务器下载内容。

我将相应的文件数据存储在名为file的变量中。

文件包含字段: FileType - 文件的MIMEType
FilePath - 服务器端文件路径

到目前为止,这是代码:

Response.Clear();
Response.ContentType = file.FileType;
Response.AppendHeader("Content-Disposition", "attachment; filename=" +     GetFileName(file));
Response.TransmitFile(file.FilePath) ;
Response.End(); 

GetFileName是一个从附件对象获取文件名的函数。我只保存路径。

上面的代码位于一个名为“Download_Clicked”的函数中,该函数是一个在点击时触发的事件。该事件映射到LinkBut​​ton。

问题是,当我运行上面的代码时,没有任何反应。标准对话框不会出现。

我尝试过标准故障排除,例如确保文件存在,并确保路径正确。他们都死了。

我的猜测是因为我的机器也是服务器,它可能无法正常处理。

提前致谢。

编辑1:尝试将控件放到另一页上,工作正常。

编辑2:通过从AJAX更新面板中删除控件解决了问题。

4 个答案:

答案 0 :(得分:3)

我发现了另一个没有删除更新面板的情况。将下面的代码放在页面加载中,您现在可以使用该按钮触发下载。

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(Button);

答案 1 :(得分:0)

尝试更改

Response.AppendHeader("Content-Disposition", "attachment; filename=" +     GetFileName(file));

Response.AppendHeader("Content-Disposition", "attachment; filename=" +     Path.GetFileName(GetFileName(file))));

如果这不起作用,您始终可以使用Response.BinaryWrite或Resonse.Write将文件流式传输到Web浏览器 以下是使用Response.Write或Response.BinaryWrite传输文件的方法。将这些函数放在某个库中,然后根据需要调用它们

 public void SendFileToBrowser(String FileName, String MIMEType, String FileData)
    {
        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName);
        Response.ContentType = MIMEType;
        Response.Buffer = true;
        Response.Write(FileData);
        Response.End();
    }

    public void SendFileToBrowser(String FileName, String MIMEType, Byte[] FileData)
    {
        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName);
        Response.ContentType = MIMEType;
        Response.Buffer = true;
        Response.BinaryWrite(FileData);
        Response.End();
    }

然后你可以在某处调用这些函数

SendFileToBrowser("FileName.txt", "text/plain", "Don't try this from an Update Panel. MSAjax does not like it when you mess with the response stream.");

答案 2 :(得分:0)

改为使用Response.WriteFile()

另外,请勿使用Response.End()!这会中止线程。使用Response.Flush(); Response.Close();

答案 3 :(得分:0)

请参阅初始帖子上的编辑。

删除了Ajax Update Panel以解决错误。小组正在将帖子停回服务器。

欲了解更多信息,请参阅Cris Valenzuela的评论。