在smartGWT中打开/保存文件

我已经实现了RPCService,RPCServiceAsync和RPCServieImpl。 单击按钮时,将调用服务器端的服务,它将从DB获取数据并创建文件。 创建文件后,我需要在客户端打开该文件,并需要提示一个带有打开/保存选项的对话框。 我该如何实现这个打开文件部分。 请提示一种方法来实现t ..回复请…提前感谢….

@Hambend:我还有一个澄清!如何在另一个servlet中调用这个doGet方法,即在我的onmodule加载类中我有很多小部件在单独的布局中,一个这样的小部件是BUTTON? 单击此按钮服务RPCServiceImpl被调用,所有操作都完成,文件在serperate函数中创建(public int GenerateFile(String name)())。 如何使该函数调用doGet方法? 既然doGet需要请求,响应参数会随之传递? 请给我一个调用该方法的方法。 提前致谢

GWT的RPC服务只能将java对象发送回客户端。 要将文件发送回用户,您需要使用非GWT java servlet。 这是我之前用于从存储库提供jpeg图像的一些代码。

public class ImageServlet extends HttpServlet { private final String repository = "/var/images/"; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = request.getParameter("file"); // Security: '..' in the filename will let sneaky users access files // not in your repository. filename = filename.replace("..", ""); File file = new File(repository + filename); if (!file.exists()) throw new FileNotFoundException(file.getAbsolutePath()); response.setHeader("Content-Type", "image/jpeg"); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-disposition", "attachment;filename=\"" + filename + "\""); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); byte[] buf = new byte[1024]; while (true) { int length = bis.read(buf); if (length == -1) break; bos.write(buf, 0, length); } bos.flush(); bos.close(); bis.close(); } } 

“内容处理:附件”应该导致大多数浏览器下载文件而不是显示它,文件名默认为您提供的任何内容。 使用此servlet的方法是让用户调用您已有的RPCService,将文件保存到存储库文件夹。 然后,使用诸如http://your.domain.com/fileServlet?file=myFile.jpg之类的URL将它们链接或重定向到此servlet。 显然,使用此设置存在安全风险,如果用户可以猜出文件名,则可以下载其他人的文件。

您可能想要做的是将RPC服务中的数据库代码合并到此servlet中。 无需将文件保存在服务器上的任何位置,您可以获取数据库结果并将其写入response.getOutputStream()或response.getWriter(),其方式与将文件写入文件的方式完全相同,只是结果如下:直接给用户。 只要您正确设置内容标题,用户就不会注意到差异。

您不能从另一个servlet调用此方法,使浏览器将其作为文件下载的唯一方法是通过普通的HTTP请求访问它。 首先,在web.xml文件中声明servlet,就像在GWT RPC服务中一样:

  ImageServlet  com.package.ImageServlet    ImageServlet /imageServlet  

现在,任何进入http://your.tomcat.server/webapp/imageServlet的 HTTP GET请求都将被ImageServlet.doGet()接收。 然后在客户端,您可以创建一个正常的HTML链接到该文件:

 new HTML("download"); 

…或者,您应该能够将其放入ClickHandler(我还没有测试过):

 Window.Location.assign(GWT.getHostPageBaseURL() + "imageServlet?file=" + filename); 

如果文件是文本,那么您总是使用字符串数组备份一个Object。
如果是二进制,则只需要类中的byte []即可。