0

私のアプリケーションの手順は次のとおりです。

  1. クライアントがチェックボックスで複数のファイルを選択し、
  2. リクエストはファイルの識別子で形成されます。
  3. クライアントは iframe 経由でアーカイブをダウンロードします: (サーバーがこれらのファイルを見つけて圧縮し、zip アーカイブのバイトを含む応答が形成されます)

iframe のコードは次のとおりです。

function makeSaveFrame(urlToServer) {
      var ifrm = document.createElement("IFRAME");
      ifrm.setAttribute("style", "display:none;");
      ifrm.setAttribute("src", 'urlToServer';
      ifrm.style.width = "0px";
      ifrm.style.height = "0px";
      document.body.appendChild(ifrm);
}

応答のタイプとヘッダー:

response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachments; filename=\"" + fileName + ".zip\"");

問題は、何か問題が発生した場合、クライアントに理由を送信する必要があることです。私に関する限り、エラー メッセージは JSONObject 型でなければなりません。

[サーバーでエラーが発生した場合、応答のコンテンツ タイプを変更して JSONObject を送信できますが、応答をフィルタリングする方法や、iframe で応答を受信するイベントをキャッチする方法さえわかりません]

この問題に関する経験を共有してください。

アップデート

私が送れば

response.sendError(HttpServletResponse.SC_BAD_REQUEST, "testMessage");

悪い応答応答が届きますが、makeSaveFrame() メソッドの周りの try/catch ブロックはこれをキャッチしません。

更新 私はこれを試しました

var uploadForm = document.createElement('form');
                    uploadForm.name = 'uploadForm';
                    uploadForm.setAttribute("style", "display:none;");
                    document.body.appendChild(uploadForm);

                    Ext.Ajax.request({
                        url: 'requestURL',
                        form: uploadForm.getForm().getEl(),
                        isUpload : true,
                        method: 'post',
                        failure : function() {
                            Ext.MessageBox.show({
                                title   : 'title',
                                msg     : 'message',
                                buttons : Ext.MessageBox.OK
                            });
                        }
                    });

ただし、isUploadパラメーターは失敗のコールバックを強制終了します。そのため、サーバーが不適切な応答応答で応答した場合、エラー ハンドラー (失敗のコールバック) は表示されません。

4

2 に答える 2

0

この記事をご覧ください。アップロード後にコンテンツを操作して、ハンドラーを適用できるようです。残念ながら、2 つの問題がありました。

  1. IE で 2 つのウィンドウが開き、2 つ目のウィンドウ (iframe) がファイルのダウンロード後に閉じません (FF では完全に動作します)。

  2. 応答が到着したとき、コンテンツは常に空であり、私はそれを見積もることができません.

次のアイデアは、応答ヘッダー (iframe) から Cookie を取得することです。この解決策はかなり有望に思えます...

于 2012-06-28T14:30:23.107 に答える
0

質問を更新し、フレームを使用してコンテンツをリクエストしなくなったため、jquery を使用できます。これは、問題の更新されたコンテンツ (最後の ExtJS4 部分) に似ている可能性があります。

         $.ajax({
                    url: 'requestURL',
                    form: uploadForm.serialize(),
                    method: 'post',                        
                    error : function(jqXHR, textStatus, errorThrown) {
                        // you can check the jqXHR object properties & methods to check
                        //  the response status and contentType
                        alert("An error occured.");
                    }
                });

これが役立つことを願っています.Jquery AJAXリクエストのその他のオプションについては、JQueryリファレンスに従ってください

PS : jquery ライブラリ ファイルをページに追加する必要があります。

于 2012-06-27T14:03:10.877 に答える