1

我正在 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

4 回答 4

3

我找到了另一个无需删除更新面板即可执行此操作的方法。将下面的代码放入您的页面加载中,您现在就可以使用该按钮来触发下载。

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

于 2011-11-07T11:52:46.513 回答
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.");
于 2011-10-17T16:51:09.803 回答
0

改为使用Response.WriteFile()

另外,不要使用Response.End()!这将中止线程。采用Response.Flush(); Response.Close();

于 2011-10-17T18:08:44.177 回答
0

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

删除了 Ajax 更新面板以解决错误。该小组正在停止将帖子发送回服务器。

有关更多信息,请参阅 Cris Valenzuela 的评论。

于 2011-10-18T16:34:18.520 回答