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

请看这篇文章。似乎可以在上传后操纵内容,因此可以对其应用处理程序。不幸的是,我有两个问题:

  1. 在 IE 中,打开 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 回答