GWTのRPCサービスは、Javaオブジェクトをクライアントに送り返すことしかできません。ファイルをユーザーに送り返すには、GWT以外のJavaサーブレットを使用する必要があります。これは、リポジトリから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();
}
}
「Content-disposition:attachment」を使用すると、ほとんどのブラウザでファイルが表示されるのではなくダウンロードされ、ファイル名はデフォルトで指定されたものになります。このサーブレットを使用する方法は、ユーザーに既存のRPCServiceを呼び出させることです。これにより、ファイルがリポジトリフォルダーに保存されます。次に、http://your.domain.com/fileServlet? file = myFile.jpgなどのURLを使用して、それらをこのサーブレットにリンクまたはリダイレクトします。明らかに、この設定では、ユーザーがファイル名を推測できる場合に他の人のファイルをダウンロードできるというセキュリティリスクがあります。
あなたがしたいと思うかもしれないことはあなたのRPCサービスからこのサーブレットにデータベースコードをマージすることです。サーバー上のどこかにファイルを保存する必要はありません。データベースの結果を取得して、ファイルに書き込むのとまったく同じ方法でresponse.getOutputStream()またはresponse.getWriter()に書き込むことができますが、結果は次のようになります。ユーザーに直接。コンテンツヘッダーを正しく設定している限り、ユーザーは違いに気付くことはありません。
別のサーブレットからこのメソッドを呼び出すことはできません。ブラウザにファイルとしてダウンロードさせる唯一の方法は、通常のHTTPリクエストを介してアクセスすることです。まず、GWT RPCサービスと同じように、web.xmlファイルでサーブレットを宣言します。
<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);