生成动态文件并在 GWT 中下载

Posted

技术标签:

【中文标题】生成动态文件并在 GWT 中下载【英文标题】:Generating a dynamic file and download it in GWT 【发布时间】:2012-04-20 07:56:46 【问题描述】:

我正在开发一个 GWT 应用程序。此应用程序正在服务器中运行。好吧,我实现了一个按钮,它调用一个在服务器端生成本地文件的方法。但是我想在客户端下载/生成这个文件。我怎么能在 GWT 中做到这一点?

谢谢

【问题讨论】:

【参考方案1】:

在我们的项目中,我们按需在服务器上创建了一个文件。文件创建成功后,我们会向浏览器发送通知并创建一个链接。

查看 servlet 代码:

public class DownloadServlet extends HttpServlet               
    private FileManager fileManager;        
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        String encodedFileName = req.getRequestURI().substring(
                req.getContextPath().length() + req.getServletPath().length() + 1);
        String decodedFileName = URLDecoder.decode(encodedFileName, "utf-8");    
        File downloadableFile = fileManager.toFile(decodedFileName);

        ServletOutputStream os = resp.getOutputStream();
        try 
            InputStream is = FileUtils.openInputStream(downloadableFile);
            try 
                IOUtils.copy(is, os);
             finally 
                is.close();
            
         finally 
            os.close();
        
    

【讨论】:

嗨,谢谢你的回答,这正是我想要的!不过,对于 FileManager 类的一个问题,我似乎找不到有关使用 FileManager.toFile(...) 方法的文档。这是com.hp.hpl.jena.util.FileManager 类吗? 不,这是我们内部的实现。您必须将 decodedFileName 转换为 downloadableFile - 文件系统中的真实路径。【参考方案2】:

目前的情况是,并不是所有的浏览器都能使用本地文件系统,所以GWT没有通用的解决方案。另外据我所知 FilesSstem API 还没有完成。

作为替代方案,您可以继续使用服务器端生成的文件,或使用 Flash 插件来生成和存储文件(您必须创建一个 Flash 应用程序,并创建一些 API 来从 GWT 控制它)。

【讨论】:

【参考方案3】:
    private native void Download(String filename, String text)/*-
      var pom = document.createElement('a');
      pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
      pom.setAttribute('download', filename);
      document.body.appendChild(pom);
      pom.click();
     document.body.removeChild(pom); -*/;

使用 GWT 代码中的 JSNI 方法,除了 JSON 字符串 作为文本(字符串)提供您要下载的文件名,此方法会将文本变量中具有指定内容的文件下载到客户端浏览器

【讨论】:

【参考方案4】:

您绝对应该看看Aki Miyazaki’s html5 file download code for GWT。 它可以按照您的要求在客户端工作。

AFAIK,到目前为止,它仅适用于 Chrome,但随着其他浏览器实现 download attribute,这应该会改变。

【讨论】:

【参考方案5】:

您可以使用Data URIs:

    让您的 GWT RPC 方法返回文件内容或数据以生成文件。 在客户端,用接收到的文件内容格式化Data URI或生成数据内容。 使用Window.open 打开一个文件保存对话框,传递格式化的DataURI。

看看这个参考,了解Data URI的用法:

Export to csv in jQuery

【讨论】:

以上是关于生成动态文件并在 GWT 中下载的主要内容,如果未能解决你的问题,请参考以下文章

如何即时生成文件并在下载后将其删除?

如何使用 Gin 在 HTTP 服务器中动态生成 zip/7z 存档?

从 GWT 调用 servlet 并使用 servlet 生成的 post 数据和下载文件

从 Dash/Flask 应用程序下载动态生成的文件

GWT StackLayoutPanel:动态和自动高度

Chrome 开发工具将 Grails 应用程序中动态生成的文件的下载状态显示为已取消