1

Excelファイルをダウンロードする必要がある状況があります。だから私はそのためにWindow.openを使います。問題は、Window.open を呼び出す前に、サーバーの場所にファイルが存在するかどうかを確認する必要があることです。したがって、ユーザーが呼び出しの下のダウンロードボタンをクリックすると、

public void onClick(Button button, EventObject e) {
   final String url = GWT.getModuleBaseURL() + "fileupload/dailyLogReport?param1=param1                                 
   openFileDownloadWindow(url,fileName);
}

public void openFileDownloadWindow(final String url,String fileName){
     CommonServiceAsync serviceAsyn = CommonService.Util.getInstance();
     final AsyncCallback callback = new AsyncCallback() {
         public void onSuccess(Object result) 
         {                              
             isFileExsist = (Boolean)result;

             if(isFileExsist){
            Window.open( url, "_blank", "status=0,toolbar=0,menubar=0,location=0");
             }else{
                Window.alert("File not found."); 
             }

         }              
         public void onFailure(Throwable caught) 
         { 
                MessageBox.alert("Error", "Error while getting data"
                        + caught.getMessage());
         } 
      };  
      // calling of the action
      serviceAsyn.isDailyLogFileExsists(fileName, callback);    

}

しかし、問題は、Window.openを成功の中に入れると、ウィンドウが開き、ファイルをダウンロードせずにすぐに閉じることです。しかし、Window.open を onClick メソッドに直接配置すると、ウィンドウ ポップアップが正常に開き、ファイルが正常にダウンロードされます。しかし、ファイルが存在するかどうかを確認して条件付きでファイルをダウンロードする必要があるため、onClick 内に Window.open を配置することはできません。

コールバック成功関数内で Window.open が正しく動作しない理由は何ですか?

4

1 に答える 1

1

問題はポップアップブロッカーです。

要素をクリックすると、新しいウィンドウを開くことができます。これは、ブラウザーがウィンドウを開く意図的なユーザー アクションであると見なすためです。

それ以外の場合、ブラウザーは、window.open を非同期ブロックでブロックします。これは、悪意のあるコードがユーザーの制御を超えて実行される可能性があると見なされるためです。

最善の解決策は、ファイルを iframe で開くことですが、サーバー側で適切な content-disposition ヘッダーを設定する必要があります。これにより、ブラウザーに [保存] ダイアログが表示されます。

クライアントコード:

  // Create a new iframe
  final Frame f = new Frame();
  f.setUrl(url_to_my_excel_file");
  // Set a size of 0px unless you want the file be displayed in it
  // For .html images .pdf, etc. you must configure your servlet
  // to send the Content-Disposition header
  f.setSize("0px", "0px");
  RootPanel.get().add(f);
  // Configure a timer to remove the element from the DOM
  new Timer() {
    public void run() {
      f.removeFromParent();
    }
  }.schedule(10000);

サーバーコード:

protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException {
   [...]
   // Set the appropriate type for your file 
   resp.setContentType("application/vnd.ms-excel");
   // Mandatory if you want the browser open the save dialog
   resp.setHeader("Content-Disposition:", "attachment;filename='my_excel_file.xls'");
   [...]
}
于 2013-07-17T06:13:37.737 に答える