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请求对其进行访问。首先,像在GWT
RPC服务中一样,在web.xml文件中声明servlet:
<servlet> <servlet-name>ImageServlet</servlet-name> <servlet-class> com.package.ImageServlet </servlet-class></servlet><servlet-mapping> <servlet-name>ImageServlet</servlet-name> <url-pattern>/imageServlet</url-pattern></servlet-mapping>
现在,去往http://your.tomcat.server/webapp/imageServlet的所有HTTP
GET请求都将被ImageServlet.doGet()接收。然后在客户端,您可以建立到该文件的普通html链接:
new HTML("<a href='" + GWT.getHostPagebaseURL() + "imageServlet?file=" + filename + "'>download</a>");…或者,您 应该 可以将其放入ClickHandler(我尚未对其进行测试):
Window.Location.assign(GWT.getHostPagebaseURL() + "imageServlet?file=" + filename);



