【问题标题】:content disposition with attachment doesnt work for AJAX response带有附件的内容配置不适用于 AJAX 响应
【发布时间】:2011-12-02 19:32:03
【问题描述】:

对我来说问题很简单。 Onclick 一个锚标签,我使用a4j:jsFunction 执行一个javascript,这个函数的动作应该从服务器流式传输一个XML 文件。问题是,在richfaces 响应上发送的流没有给出saveAs 对话框,而是在浏览器上呈现xml。在阅读了许多文章后,我了解到 Ajax 响应无法提供 saveAs 对话框。

xhtml sn-p:

<h:form>
        <a4j:jsFunction name="updateCart" reRender="idFavouritePanel">
            <a4j:actionparam name="jsonObject" assignTo="#{archiveOrderBean.jsonObject}"/>
        </a4j:jsFunction>

         <a4j:jsFunction  name="download" reRender="partTableId" action="#{archiveOrderBean.loadSelectedOrder}">
            <a4j:actionparam name="strId" assignTo="#{archiveOrderBean.strId}"  />
        </a4j:jsFunction>
</h:form>

以及来自 bean 的响应集。

response.setContentType("application/xml");
                    response.setContentLength(byteArr.length);
                    response.addHeader("Content-Disposition", "attachment; filename=" + attr.getUrl());
//                  writer.write(byteArr.toString());
//                  writer.flush();
                    response.getOutputStream().write(byteArr);
                    response.getOutputStream().flush();
                    // post(trueStr,encPath,encUrl,trueStr,response);
                    FacesContext.getCurrentInstance().responseComplete();

这方面的任何帮助都会非常有帮助。

【问题讨论】:

    标签: ajax jsf servlets richfaces jsf-1.2


    【解决方案1】:

    是的,您不能使用 ajax 触发 saveAs 对话框。您可以做的是返回一个 URL。然后打开该 URL(使用 javascript)。然后服务器应该发送文件(带有适当的标题)。当然,您可以跳过所有这些,只需提供指向相关 URL 的链接(除非它是动态生成的)

    【讨论】:

    • 谢谢。我也有同样的想法,但正在等待我是否可以在这方面得到更多的学习:-)
    • @chaosguru:Ajax 请求由 JavaScript 代码处理。 JavaScript 无法处理二进制响应并强制出现另存为对话框。您确实必须通过普通按钮或链接发送完全有价值的同步请求。当前页面将在浏览器中保持不变。这里不需要 JS/Ajax。
    • @BalusC:非常感谢,您的描述真的很有帮助。我会做相应的更改。
    【解决方案2】:

    我可以用不太推荐但别无选择的粗略方法来解决这个问题。

    我添加了一个隐藏的h:commandButton 并从a4j:jsFunction 中移动了属性action="#{archiveOrderBean.loadSelectedOrder}",在完成javascript 执行后,我使用javascript 显式调用h:commandButton 的点击事件。这将同步请求 XML。总之欺骗点击事件。

    这是我必须进行更改的一种方式,因为 XML 是在运行时创建的。另一种方式正如@Bozho 所解释的那样。

    感谢@BalusC 的帮助 :-)

    【讨论】:

      猜你喜欢
      • 2017-11-02
      • 2016-06-27
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2016-02-27
      • 2014-02-16
      相关资源
      最近更新 更多