触发从GWT客户端代码下载servlet,而不会失去状态或造成干扰

触发从GWT客户端代码下载servlet,而不会失去状态或造成干扰,gwt,servlets,download,Gwt,Servlets,Download,为什么呢,我是个新手,对那些花哨的网络技术缺乏经验,所以很抱歉这个可能很愚蠢的问题。我有一个GWT应用程序 在服务器端生成excel工作表 将其存储在指定的位置 应在导出后触发已创建文件的下载 并将其保存在服务器上 到目前为止,一切正常,我现在唯一的问题是,在我的一生中,我无法找到一种方法来正确触发文件的下载 下载本身是由一个servlet处理的,这里的各种问题都很好地涵盖了这个主题。到目前为止,我发现的所有问题中都遗漏了一个问题:“如何在不失去GWT状态或不打开令人讨厌的新窗口的情况下‘调

为什么呢,我是个新手,对那些花哨的网络技术缺乏经验,所以很抱歉这个可能很愚蠢的问题。我有一个GWT应用程序

  • 在服务器端生成excel工作表
  • 将其存储在指定的位置
  • 应在导出后触发已创建文件的下载 并将其保存在服务器上
到目前为止,一切正常,我现在唯一的问题是,在我的一生中,我无法找到一种方法来正确触发文件的下载

下载本身是由一个servlet处理的,这里的各种问题都很好地涵盖了这个主题。到目前为止,我发现的所有问题中都遗漏了一个问题:“如何在不失去GWT状态或不打开令人讨厌的新窗口的情况下‘调用/触发/不管什么’该servlet?”

以下代码片段在理论上是可行的,但在我看来不是一个有效的选项

String url=GWT.getHostPageBaseURL()+MyExport.SERVLET\u url\u模式+“?”+MyExport.FILENAME+“=”+result.getFileName();
//在这次呼叫之后,我的GWT状态丢失
Window.Location.assign(url);
//无论如何,大多数浏览器都会阻止弹出窗口
打开(url,“新窗口名称”,“可调整大小,滚动条,状态”);
我尝试在presenter类中设置这些调用可能会引起兴趣。
如果我没有找到正确的问题,这是一个重复的问题,我将继续搜索并发布我找到的所有内容。

我使用与您的窗口类似的代码。在下载服务器端生成的pdf的应用程序中打开代码,这与您尝试执行的操作非常类似。它不会导致弹出窗口,因为servlet流文件的内容类型设置正确:

// Client side code in a click handler that triggers the download
Window.open("PromoPriceList?fileKey=" + itemKey, "_blank", "");


// In the servlet that is called, resp is the HttpServletResponse
resp.setContentType("application/pdf");
resp.setDateHeader("Expires",0);
resp.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
resp.setHeader("Pragma", "public");
resp.setHeader("Content-Disposition", "inline; filename=" + /* name for client */);
resp.setContentLength(/* size of file */);
// Stream the content with resp.getOutputStream().write(...)

IFrame方法对我来说非常有效。 在客户端的某些实用程序类中,您可以提供一个简单的静态“triggerDownload(String url)”

IFrame:

<iframe src="javascript:''" id="__gwt_downloadFrame" tabIndex='-1' style="position: absolute; width: 0; height: 0; border: 0; display: none;"></iframe>

谢谢,但这不是我的问题,内容类型设置为它应该是,我省略了这一部分,以免混淆。我想我找到了问题的答案,一个iframe。
import com.google.gwt.dom.client.Document;
import com.google.gwt.user.client.ui.Frame;

public class Utils

  private static Frame downloadFrame;

  public static void triggerDownload(final String url) {
    if (url == null) {
      throw new IllegalArgumentException("URL must not be null");
    } // if

    if (downloadFrame == null) {
      downloadFrame = Frame.wrap(Document.get().getElementById("__gwt_downloadFrame"));
    } // if
    downloadFrame.setUrl(url);
  } // triggerDownload()
} // class Utils