0

我使用 MGWT 和 GwtPhoneGap 开发了一个应用程序,并使用 rpc 进行服务器通信。我想将文件从服务器下载到我的客户端设备(iOs/android)。这可能吗?如果是这样,我需要做什么来实现我的目标?我没有得到 MGWT 论坛的大力支持。请告诉我这样做的方法。

提前致谢

我在我的问题上付出了一些努力,我已经这样做了。但仍然没有成功。请通过我的代码。

public final native String download(String serverUrl,String filepath,Callback callback)
  /*-{
return this.download(serverUrl, filePath, function(result) {
callback.Callback::o:onSuccess(Result;);)(result);
}, function(error) {
 callback.Callback::o:onError(Error;);)(error);
});
  }-*/;
4

2 回答 2

3

如果文件是一个简单的文件(例如PDF),只要放一个文件URL的链接,手机导航器就会把文件下载到手机上。如果生成了文件,则必须创建一个 servlet 来进行下载:

public class ServletDownloadDemo extends HttpServlet{

  private static final int BYTES_DOWNLOAD = 1024;

  public void doGet(HttpServletRequest request, 
   HttpServletResponse response) throws IOException{
    response.setContentType("text/plain");
    response.setHeader("Content-Disposition",
                     "attachment;filename=downloadname.txt");
    ServletContext ctx = getServletContext();
    InputStream is = ctx.getResourceAsStream("/testing.txt");

    int read=0;
    byte[] bytes = new byte[BYTES_DOWNLOAD];
    OutputStream os = response.getOutputStream();

    while((read = is.read(bytes))!= -1){
        os.write(bytes, 0, read);
    }
    os.flush();
    os.close(); 
   }
}

在用于发布请求的 GWT 中,您可以使用 FormPanel 将请求发送到隐藏的 iframe。

FormPanel form = new FormPanel();
form.setMethod(FormPanel.METHOD_POST);
form.setAction("/downloadServlet");
FlowPanel hiddenPanel = new FlowPanel();
hiddenPanel.add(new Hidden("name1", "value"));
hiddenPanel.add(new Hidden("name2", "value"));
form.setWidget(hiddenPanel);
RootPanel.get().add(form);
form.submit();

或者你可以放一个真实的表格。

但是使用PhoneGap,您可以使用文件API,但您必须询问用户在他的手机中写入文件的位置。如果需要,您可以通过 RPC 请求下载文件内容,然后写入文件。

于 2013-09-19T08:21:47.607 回答
0

就我而言,我只是编写了一个 servlet 来提供文件。

从那时起,您有两个选择:

  • 在您的应用程序中放置一个链接并将用户重定向到将被 servlet 捕获的 url。
  • 对于 POST 请求,使用RequestBuilder(不是隐藏表单!),然后使用 JSNI 将响应写入新窗口。

    private native void openWindow(String contents, String blockedMsg) /*-{
            var win = window.open("", "_blank");
            if (win && win.top) {
                win.document.write(contents);
            } else {
                alert(blockedMsg);
            }
    }-*/;
    
于 2013-09-19T07:36:24.297 回答