当前位置: 首页 > 面试题库 >

附件的HTTP响应标头内容处理

柳英资
2023-03-14
问题内容

背景

将XML文档写入浏览器的响应流,并使浏览器显示“另存为”对话框。

问题

请考虑以下download()方法:

  HttpServletResponse response = getResponse();

  BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(
      response.getOutputStream() ) );

  String filename = "domain.xml";
  String mimeType = new MimetypesFileTypeMap().getContentType( filename );

  // Prints "application/octet-stream"
  System.out.println( "mimeType: " + mimeType );

  // response.setContentType( "text/xml;charset=UTF-8" );
  response.setContentType( mimeType );
  response.setHeader( "Content-Disposition", "attachment;filename="
      + filename );

  bw.write( getDomainDocument() );
  bw.flush();
  bw.close();

在Firefox中,XML内容显示在浏览器窗口中。在IE 7中,不会显示XML内容-您必须查看文档源。两种情况都不是理想的结果。

该网页对该按钮使用以下代码:

    <a4j:commandButton action="#{domainContent.download}" value="Create Domain" reRender="error" />

生成的XML 并非以 开头<?xml version="1.0"?>,而是XML内容类似于:

<schema xmlns="http://www.jaspersoft.com/2007/SL/XMLSchema" version="1.0">
  <items>
    <item description="EDT Class Code" descriptionId="" label="EDT Class Code" labelId="" resourceId="as_pay_payrolldeduction.edtclass"/>
  </items>
  <resources>
    <jdbcTable datasourceId="JNDI" id="as_pay_payrolldeduction" tableName="as_pay.payrolldeduction">
      <fieldList>
        <field id="payamount" type="java.math.BigDecimal"/>
      </fieldList>
    </jdbcTable>
  </resources>
</schema>

更新#1

请注意以下代码行:

response.setHeader( "Content-Disposition", "attachment;filename=" + filename );

更新#2

使用<a4j:commandButton ... />是问题。一个正常的<h:commandButton .../>表现如预期。使用<h:commandBUtton .../>可以防止<a4j:outputPanel .../>刷新任何错误消息。

相关的接缝消息。

哑剧类型

以下MIME类型不会触发“另存为”对话框:

  • "application/octet-stream"
  • "text/xml"
  • "text/plain"

哪些更改将导致a4j:commandButton触发“另存为”对话框,以便提示用户保存XML文件(如domain.xml)?

谢谢。


问题答案:

问题

该代码存在以下问题:

  • Ajax调用(<a4j:commandButton .../>)不适用于附件。
  • 创建输出内容必须首先发生。
  • 显示错误消息也不能使用基于Ajax的a4j标签。

  1. 更改<a4j:commandButton .../><h:commandButton .../>
  2. 更新源代码:
    1. 更改bw.write( getDomainDocument() );bw.write( document );
    2. 添加String document = getDomainDocument();到的第一行try/catch
  3. <a4j:outputPanel.../>(未显示)更改为<h:messages showDetail="false"/>

本质上,删除与相关的所有Ajax工具commandButton。仍然可以显示错误消息并利用RichFaces UI样式。

参考资料

  • jsf页面中使用commandButton下载文件
  • http://www.coderanch.com/t/483892/JSF/java/when-commandButton-commandLink
  • http://seamframework.org/135584.lace


 类似资料:
  • 我正在使用Fiddler监视对ServiceStack API的调用,并且在内容长度字段中看到一个逗号。我只有在部署到特定的Windows服务器时才会看到这一点。这是什么意思? 整个回应: 我认为内容长度字段中不允许使用逗号。

  • 问题内容: 为了避免未知,我一直试图避免使用大多数HTTP协议的属性。 但是,我对自己说,今天我将面对恐惧,开始有目的地使用标题。我一直在尝试将数据发送到浏览器并立即使用。例如,如果我有一个处于就绪状态4的Ajax处理程序函数,如下所示: 并且我在PHP代码中设置了content-type标头: 当清楚地告诉浏览器传入数据为时,为什么不能直接从处理程序函数访问该属性? 问题答案: 该头只是作为您的

  • 我希望在客户端下载文件时向他们显示文件的大小。< br >但是HTTP头内容长度不起作用。< br >我环境如下。 阿帕奇 2.2 mod_deflate 轨道3.2 下载文件位于rails项目公用文件夹中。 当我下载它时,响应标头是这个。 接受范围字节 访问控制允许头...源,x 请求,内容类型 访问控制允许甲基...放置、获取、发布、删除、选项 访问控制-允许-原始...http://*.co

  • 问题内容: 有什么方法可以获取原始响应的HTTP标头? 该方法对我不起作用,因为服务器吐出了多个“ Set-Cookie”,其中一些丢失了。 问题答案: 该方法对我不起作用 您是在的情况下问这个的吗?不可以,无法使用原始HTTP响应标头。您需要退回到低级的Socket编程。这是一个SSCCE,只需复制“ 粘贴 ”即可运行它。 为了避免每个尝试此代码片段的人都使SO过载,输出如下所示: 要了解有关以

  • 我试图向一个我无法控制的服务器发出GET请求,该服务器在头中返回一个无效值:“application/json;charset=”。 当我尝试执行GET调用时,Spring在尝试解析该值时抛出一个InvalidMimeTypeException,因为它正确地期望在that=符号后面应该有一个实际的字符集。

  • 问题内容: 如何从WebView获得HTTP标头响应?我找到了半解决方案,但是它是用Objective- C编写的,不能将其转换为Swift(我已经尝试过使用较差的Obj-C知识了)。 Objective-C代码: 该代码将如何看待Swift? 也许现在我们有更好的方法呢?并不总是启用缓存。 问题答案: 迅速 斯威夫特更严格; 您想保护自己免受指针和: 检查实际是否有 检查实际是否有 对响应进行类