如何在ColdFusion中读取多部分响应



我正在做一个CFHTTP帖子,该帖子正在返回两个部分(Multipart(,XML和PDF。我希望只能得到PDF。我的cfhttp.filecontentjava.io.ByteArrayOutputStream类型。当我做toString()时,我会得到以下

第1部分

Content-Type: application/xop+xml; type="text/xml"; charset=utf-8
Content-Transfer-Encoding: 8bit

第2部分

Content-Type: application/pdf
Content-Transfer-Encoding: binary

我在cfhttp.filecontent中获得响应,数据看起来如下

--MIME_Boundary
Content-ID: <aa82dfa.N51ec355b.3.15b86044531.59d6>
Content-Type: application/xop+xml; type="text/xml"; charset=utf-8
Content-Transfer-Encoding: 8bit
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">....</soapenv:Envelope>
--MIME_Boundary
Content-Id: <2958beaa-dd72-4879-9d80-cc19876b2c2a@example.jaxws.sun.com>
Content-Type: application/pdf
Content-Transfer-Encoding: binary
%PDF-1.4
%ÈÁÄ×
<content removed>
25081
%%EOF
--MIME_Boundary--

我试图删除与PDF无关的所有数据,但仍然不是有效的二进制文件。

有什么想法吗?

来自评论

当我在fileContent上进行cfdump时,我会得到以下内容:

Class Name: java.io.ByteArrayOutputStream 
Methods: 
    close() returns void 
    reset() returns void 
    size() returns int 
    toByteArray() returns byte[] 
    toString(java.lang.String) returns java.lang.String 
    toString() returns java.lang.String 
    toString(int) returns java.lang.String 
    write(byte[], int, int) returns void 
    write(int) returns void 
    writeTo(java.io.OutputStream) returns void

调用toByteArray()时,我会获取二进制数据。然后,我将数据保存到文件中,然后看到文件的XML和PDF部分。

解决方法需要两个更改:将可接受的编码值设置为GZIP,放气并使用Java使用二进制数据的更改。

<cfhttpparam type="HEADER" name="Accept-Encoding" value="gzip,deflate">

第二,我需要使用二进制方法来操纵响应。

binResponse = result.fileContent.toByteArray();

接下来,我使用了Ben Nadel biny.cfc的实用程序,该实用程序具有我需要的所有二进制操作。我使用方法binarySlice()提取二进制的起始和终点。切成薄片的数据包含我需要的确切格式的二进制文件。它不是base64或任何其他类型,它是二进制。

sliced = binNadel.binarySlice( binResponse, <int posistion to start slice>, <int length of binary>));

此解决方案有效,但是在潜在问题上已经成熟,例如响应的顺序可能会切换,边界名称可能会更改等。因此,这将需要大量错误处理以确保航行。

更新:

接下来,我调查了Leigh的示例,以查看是否可以简化代码。他们建议使用Java的Mimemultipart类,该类支持分析MTOM多部分响应。这是最终的工作代码:

<cfscript>
    // Modify path as needed
    saveToDirec = "c:temp";
    // Hard coded "boundary" value for DEMO purposes. It MUST match actual value used in cfhttp response
    // Best to use cfhttp.responseHeader.content-Type so [if] the service changes your code won't break.
    contentType = "multipart/related; boundary=MIME_Boundary;";  
    // Load and parse ByteArrayOutputStream returned by CFHTTP
    dataSource = createObject("java", "javax.mail.util.ByteArrayDataSource").init(m_strSoapResponse.fileContent.toByteArray(), javaCast( "string", contentType));
    mimeParts = createObject("java", "javax.mail.internet.MimeMultipart").init(dataSource);
    for (i = 0; i < mimeParts.getCount(); i++) {
        writeOutput("<br>Processing part["& i &"]");
        bp = mimeParts.getBodyPart( javacast("int", i));
        // If this part is a PDF, save it to a file.
        if (!isNull(bp) && bp.isMimeType("application/pdf")) {
            outputFile = createObject("java", "java.io.File").init(saveToDirec &"demo_savedfile_"& i &".pdf");
            bp.saveFile(outputFile);
            writeOutput("<br>Saved: "& outputFile.getAbsolutePath());
        }
    }
</cfscript>

感谢您的输入!

相关内容

  • 没有找到相关文章

最新更新