Servlets 如何将xml编码到Base64并作为servlet响应发送回?

Servlets 如何将xml编码到Base64并作为servlet响应发送回?,servlets,groovy,base64,Servlets,Groovy,Base64,我编写了一个扩展名为.groovy的servlet,它应该以Base64编码返回xml protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String fileName=(String) request.getParamete

我编写了一个扩展名为.groovy的servlet,它应该以Base64编码返回xml

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    String fileName=(String) request.getParameter("fileName")

    if (fileName == null || fileName.equals(""))throw new ServletException("Invalid or non-existent file parameter in SendXml servlet.")
    if (fileName.indexOf(".xml") == -1)fileName = fileName + ".xml"

    System.out.println(fileName)

    try {

      String relativeWebPath = "/WEB-INF/classes/com/abc/csm/xml/"+fileName
      String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath)

      String fileContents=new File(absoluteDiskPath).text
      response.setContentType("text/xml")
      response.addHeader("Content-Disposition", "attachment filename="+ fileName)

      XmlHandler xm=new XmlHandler()

      PrintWriter out = response.getWriter()
      String enxml=xm.encodeBase64(fileContents)
      response.setContentLength((int) enxml.length)

      out.println(enxml)
      out.close()
      out.flush()
    } catch (Exception e) {       println e     } 
}
XmlHandler encodeBase64方法

def encodeBase64(String text) {
    return new String(Base64.encodeBase64(text.getBytes()))
}
但我想有些东西不见了。请帮忙

更新

另外,请说明从软件包访问文件是否正确?

您可以替换:

  String enxml=xm.encodeBase64(fileContents)

或者,最好将编码传递给对getBytes的调用:

另外,我相信你的标题中的附件后缺少一个分号。。。该行应为:

  response.addHeader( "Content-Disposition", "attachment; filename=$fileName" )
编辑、编码和解码示例: 编码:

String encoded = "tim_yates".getBytes( 'UTF-8' ).encodeBase64()
解码:

String original = new String( encoded.decodeBase64(), 'UTF-8' )
assert original == 'tim_yates'
您可以替换:

  String enxml=xm.encodeBase64(fileContents)

或者,最好将编码传递给对getBytes的调用:

另外,我相信你的标题中的附件后缺少一个分号。。。该行应为:

  response.addHeader( "Content-Disposition", "attachment; filename=$fileName" )
编辑、编码和解码示例: 编码:

String encoded = "tim_yates".getBytes( 'UTF-8' ).encodeBase64()
解码:

String original = new String( encoded.decodeBase64(), 'UTF-8' )
assert original == 'tim_yates'


@Teg:在控制台上打印文件名,然后打印java.lang。NullPointerException@AbhishekSimon它说的是哪一行抛出NPE?@tim_yates:XmlHandler给出了prob,所以我将encodeBase64放在servlet本身中,现在,它给出了groovy.lang.MissingPropertyException:没有这样的属性:Base64 for class:com.abc.csm.version.GetResponse提供了一个关于groovy对Base64@Teg:在控制台上打印文件名,然后打印java.lang。NullPointerException@AbhishekSimon它说的是哪一行抛出NPE?@tim_-yates:XmlHandler是给出prob,所以我将encodeBase64放入servlet本身,现在它给出groovy.lang.MissingPropertyException:没有这样的属性:Base64 for class:com.abc.csm.version.GetResponse以groovy的方式对Base64进行编码,我得到响应,在fiddler中,我可以看到它,但当我将它赋给一个变量并再次发送到另一个重定向时,它会附加一些其他数据。response.setContentTypetext/xml是否适合此编码?@AbhishekSimon已更新解码示例。。。如果您发送的是Base64编码的数据,那么我认为您应该执行response.addHeader“内容传输编码”、“Base64”。为什么不直接发送没有Base64编码的普通XML呢?原始项目通过编码发送,所以我必须用一些额外的特性来模仿相同的东西我使用了你编辑的代码,现在,当我接收到它并将其重新发送到另一个servlet时,它会给我java.lang.RuntimeException:base64值中的坏字符抱歉这么多trouble@AbhishekSimon不用担心;-如果设置了内容传输编码,另一端可能会自动将其解码为xml。。。在你解码之前把它打印出来以检查我得到了响应,在fiddler中我可以看到它,但是当我把它分配给一个变量并再次发送到另一个重定向时,它会附加一些其他数据。response.setContentTypetext/xml是否适合此编码?@AbhishekSimon已更新解码示例。。。如果您发送的是Base64编码的数据,那么我认为您应该执行response.addHeader“内容传输编码”、“Base64”。为什么不直接发送没有Base64编码的普通XML呢?原始项目通过编码发送,所以我必须用一些额外的特性来模仿相同的东西我使用了你编辑的代码,现在,当我接收到它并将其重新发送到另一个servlet时,它会给我java.lang.RuntimeException:base64值中的坏字符抱歉这么多trouble@AbhishekSimon不用担心;-如果设置了内容传输编码,另一端可能会自动将其解码为xml。。。先把它打印出来,然后再解码检查