回发后启动文件下载

时间:2011-02-07 20:50:04

标签: c# jquery asp.net gridview download

在我的应用程序中,我正在为用户构建一个zip文件,以便下载一些导出的数据库信息。当用户单击“生成数据”按钮并在数据库中记录请求时,将创建zip文件。

在我的页面上,我有一个Gridview,它显示用户的下载历史记录,并使他们能够在一段时间内下载最新生成的文件。

我遇到的问题是当他们点击按钮时,我想要刷新页面(从而刷新gridview并显示他们的最新请求),然后为他们启动文件下载(IE,提示提示并让他们决定是否打开/保存/取消它)。

我可以在帖子上开始下载,但我的Gridview在开始之前没有更新,所以它没有显示列表中的最新请求。如何在下载提示开始之前更新gridview?

我正在使用以下内容开始下载:

    public void BeginDownload()
    {
        FileDownload download = InventoryService.GetLastThreeFileDownloads(this.EmployeeId).First();
        FileInfo fi = new FileInfo(Server.MapPath(SERVER_DOWNLOAD_PATH) + download.DownloadFileName);

        Response.Clear();
        Response.ContentType = "application/zip";
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + fi.Name);
        Response.TransmitFile(fi.FullName);
        Response.Flush();
    }

如果隐藏字段设置为true(我在单击按钮构建文件时设置),则在Page_Load事件中调用该方法作为最后一项。

我也试过通过jQuery / AJAX调用来刷新页面并开始下载但收效甚微。我已经考虑打开一个模态对话框,让他们点击一个链接开始下载,然后在模态关闭时刷新页面,但如果我找不到另一个解决方案,这是最后的选择。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

以下是我之前做过类似事情的方式:

  1. 在回发(生成数据)时,使用gridview中的最新数据发回更新后的页面。
  2. 添加一个小的javascript函数,该函数在页面完成加载时执行,并请求生成的文件(类似window.location='fileurl';。当然只在回发时发送此javascript函数。
  3. 请求文件时显示页面的内容不会改变,只需弹出浏览器的保存对话框。

答案 1 :(得分:2)

问题是你不要将页面发回给用户。用户单击发送HTTP请求的按钮,您将为其生成包含要下载的文件的HTTP响应。如果你想刷新页面,只有在那之后向他发送要下载的文件,你需要发送一个正常的回发结果(不调用BeginDownload方法),然后以某种方式强迫他做另一个请求,您可以根据该请求回复该文件。

这里有各种选择:

  • 在页面上添加meta refresh标记
  • 使用onload JavaScript
  • 使用iframe
  • ...或让用户点击链接,正如您所说。

所有方法都有它们的缺点(尤其要注意IE的“不需要的下载”保护,在某些情况下,这可能很烦人),你应该至少包含一个下载链接“如果下载没有自动启动,点击这里“。)

答案 2 :(得分:1)

听起来你想要立刻做太多事情。我建议回发更新gridview,然后使用重定向到新的专用页面(或ashx处理程序)来下载文件。当您在下载页面/ ashx处理程序中使用content-disposition标头时,gridview页面应保持可见。