smartgwtでファイルを開き/保存します
質問
RPCService、rpcserviceasync&rpcservieimplを実装しました。ボタンをクリックすると、サーバー側のサービスが呼び出され、DBからデータを取得し、ファイルが作成されます。ファイルが作成されたら、クライアント側でそのファイルを開く必要があり、オープン/保存オプションを使用してダイアログボックスをプロンプトする必要があります。このオープニングファイルパーツを実装するにはどうすればよいですか。 plsはt ..返信pls ..を実装する方法を提案します。
@hambend:まだもう1つの明確化があります!..このdogetメソッドを別のサーブレットで呼び出す方法IEのオンモジュールロードクラス私は、個別のレイアウトに多くのウィジェットを持っています。そのようなウィジェットはボタンですか?このボタンサービスのオンクリックRPCServiceImplが呼び出され、すべての操作が行われ、ファイルは蛇行関数(public int generateFile(String name)())で作成されます。 Dogetメソッドを呼び出すためにその関数を作成する方法は? dogetはリクエストが必要なので、応答パラメーターを渡すために渡されますか? plsは、その方法を呼び出す方法を提案しています。前もって感謝します
解決
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を呼び出すことです。これにより、ファイルがリポジトリフォルダーに保存されます。次に、次のようなURLでこのサーブレットにリンクまたはリダイレクトします http://your.domain.com/fileservlet?file=myfile.jpg. 。明らかに、このセットアップを使用すると、ユーザーがファイル名を推測できる場合、ユーザーが他の人のファイルをダウンロードできるセキュリティリスクがあります。
あなたがしたいのは、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はリクエストを取得します http://your.tomcat.server/webapp/imageservlet Imageservlet.doget()によってピックアップされます。次に、クライアント側では、ファイルへの通常のHTMLリンクを作成できます。
new HTML("<a href='" + GWT.getHostPageBaseURL() + "imageServlet?file=" + filename + "'>download</a>");
...もしくは、あなた したほうがいい これをクリックハンドラーに入れることができます(テストしていません):
Window.Location.assign(GWT.getHostPageBaseURL() + "imageServlet?file=" + filename);
他のヒント
ファイルがテキストの場合、文字列の配列が付いたオブジェクトを常にバックバックします。
バイナリの場合、クラスの単純なバイト[]が実行されます。