【问题标题】:How can a user download a file in client side (Google Web Toolkit)用户如何在客户端下载文件(Google Web Toolkit)
【发布时间】:2016-03-28 11:26:45
【问题描述】:

我正在使用 GWT(Google Web Toolkit)制作网站。 我需要向用户展示一个表格,并让用户下载表格的内容。

在客户端,用户按下“下载”按钮后如何下载文件?

“下载”按钮有一个onClick() 监听器。客户端类扩展Composite

我试图让类扩展HttpServlet,但它变得太复杂了。

我已经在这里阅读过帖子:

  1. http://www.mkyong.com/java/how-to-download-file-from-website-java-jsp/
  2. How to use GWT when downloading Files with a Servlet?

但我仍然不知道如何在客户端向用户提供可下载的文件。

【问题讨论】:

  • 客户:Window.Location.replace("/downloadServlet");

标签: gwt download


【解决方案1】:

您真的需要区分 GWT 客户端 java 代码和服务器端 java 代码。

在您的 GWT Java 代码中的客户端

String url = GWT.getModuleBaseURL() + "downloadService?fileInfo1=" + fileInfo1;
Window.open( url, "_blank", "status=0,toolbar=0,menubar=0,location=0");

在您的非 gwt Java 代码中的服务器端-

在 web.xml 中

<servlet>
    <servlet-name>downloadService</servlet-name>
    <servlet-class>AAA.BBB.CCC.DownloadServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>downloadService</servlet-name>
    <url-pattern>/<gwtmodulename>/downloadService</url-pattern>
</servlet-mapping>

在服务器包代码中是一个 servlet

    public class DownloadServlet extends HttpServlet{
    protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException
        {
            String fileName = req.getParameter( "fileInfo1" );

            int BUFFER = 1024 * 100;
            resp.setContentType( "application/octet-stream" );
            resp.setHeader( "Content-Disposition:", "attachment;filename=" + "\"" + fileName + "\"" );
            ServletOutputStream outputStream = resp.getOutputStream();
            resp.setContentLength( Long.valueOf( getfile(fileName).length() ).intValue() );
            resp.setBufferSize( BUFFER );
            //Your IO code goes here to create a file and set to outputStream//

        }
    }

确保将文件内容推送到**outputStream**

【讨论】:

  • 是的,你是对的。我尝试编写自己的代码,但在客户端编写文件是不可能的。我解决这个问题与此类似。无论如何,谢谢你的回答。
  • 您可以重用您的 GWT 服务 servlet 之一,而不是创建新的 servlet,只需覆盖 javax.servlet.http.HttpServlet#doGet 方法
  • 什么是 getfile() ?这里没有定义。
  • 这实际上对我不起作用。我看到一个新窗口打开(关于:空白),文件在那里下载到文件系统,但没有显示在浏览器中。
【解决方案2】:

如果你知道文件的路径,代码 sn -p 如下所示。

button.addClickHandler(new ClickHandler()  
{ 

    @Overrid
    public void onClick(ClickEvent event) 
    {
        Window.open(GWT.getHostPageBaseURL() + "/file.rar", "name", "enabled");
    }
});

【讨论】:

  • 感谢您的评论,但我已经考虑过了。问题是我不能在客户端使用文件写入例程(可以编译,但会导致错误 - 模块加载错误)
  • 你不能用代码在客户端写文件,这样的东西在浏览器上是不允许的。您需要让浏览器下载文件,并由用户指定下载位置。
  • 你是对的。我以类似的方式解决了这个问题。无论如何,感谢您的回答。
【解决方案3】:

你可以试试ClientIO用GWT在客户端读写文件

http://www.emitrom.com/blog/client-io

【讨论】:

    【解决方案4】:

    要完成io部分第一题的答案……

    你可以参考这个链接

    http://www.programcreek.com/2009/02/java-convert-a-file-to-byte-array-then-convert-byte-array-to-a-file/

    或参考此代码

    File file = new File(enter the filepath here)
    FileInputStream fis = new FileInputStream(file);
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    byte[] buf = new byte[1024];
                    try {
                        for (int readNum; (readNum = fis.read(buf)) != -1;) {
                            bos.write(buf, 0, readNum); //no doubt here is 0
                            //Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
                            System.out.println("read " + readNum + " bytes,");
                        }
                    } catch (IOException ex) {
                        System.err.println("unable to convert to bytes");
                    }
                    byte[] bytes = bos.toByteArray();
                    outputStream.write(bytes);
                    outputStream.flush();
                    outputStream.close();
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 2020-04-16
      • 2011-04-30
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      相关资源
      最近更新 更多