1

嗨,我对那些花哨的网络技术还很陌生,对这些花哨的网络技术缺乏经验,很抱歉这个可能很愚蠢的问题。我有一个 GWT 应用程序

  • 在服务器端生成一个excel表,
  • 将其存储在定义的位置
  • 应在导出并保存到服务器后触发下载创建的文件。

到目前为止,一切都按预期工作,我现在唯一的问题是我无法终生找到正确触发文件下载的方法。

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

以下片段在理论上有效,但在我看来不是一个有效的选择。

String url = GWT.getHostPageBaseURL() + MyExport.SERVLET_URL_PATTERN + "?" + MyExport.FILENAME + "=" + result.getFileName();

// After this call my GWT state is lost
Window.Location.assign(url);

// obstrusive pop-up that is blocked by most browsers anyway
Window.open(url, "NameOfNewWindow", "resizable,scrollbars,status");

我尝试在我的演示者类中设置这些调用可能会很有趣。如果我没有找到正确的问题并且这是重复的,请提前抱歉,我将继续搜索并发布我找到的所有内容。

4

2 回答 2

2

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

框架:

<iframe src="javascript:''" id="__gwt_downloadFrame" tabIndex='-1' style="position: absolute; width: 0; height: 0; border: 0; display: none;"></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
于 2013-05-13T12:17:51.990 回答
0

我在下载服务器端生成的 pdf 的应用程序中使用类似于您的 Window.open 代码的代码,这与您尝试执行的操作非常相似。它不会导致弹出窗口,因为 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(...)
于 2013-05-08T12:35:35.323 回答