ColdFusion将来自Web服务的base64块组合成二进制文件

时间:2015-01-27 23:00:22

标签: xml web-services coldfusion

我正在使用一个返回base64块中的大文件的Web服务。当Web服务只返回1个块时,我可以使用toBinary()来转换并保存到文件中。但是当我找回大块的base64字符串时,我不知道该怎么做。简单的变量连接不起作用。是否有正确的方法在Cold Fusion中加入这些字符串然后转换为二进制文件?

<cfset masterChunk = masterChunk & theNextChunk />
<cfset binaryFile = toBinary(masterChunk) />

我得到的错误是:必须是base-64编码的字符串。

2 个答案:

答案 0 :(得分:1)

(只是抛出一些想法......)

连接多个base64字符串对我来说很好,所以这里可能会有更多的东西。没有实际的字符串很难说。

也就是说,如果最终目标是将二进制文件保存到文件中,为什么不直接将解码后的字节附加到文件中?它更简单,可以与物理文件一起使用,也可以与ram:///

中的文件一起使用
    // open for appending
    output = FileOpen( "c:/path/to/file.ext, "append");

    // append decoded bytes
    FileWrite(output, binaryDecode(firstChunk, "base64"));
    FileWrite(output, binaryDecode(nextChunk, "base64"));
    // ... append more bytes

    FileClose(output);

如果你真的需要一个数组,另一种可能性就是使用ByteArrayOutputStream。同样,它使用起来稍微简单,适用于中等大小的文件。对于较大的文件,ByteBuffer可能更有效。

    baos = createObject("java", "java.io.ByteArrayOutputStream").init();

    // append decoded bytes
    baos.write( binaryDecode(firstChunk, "base64") );
    baos.write( binaryDecode(nextChunk, "base64") );
    baos.close();

    // do something with the array (save to file, etcetera)
    FileWrite( "c:/path/to/file.ext", baos.toByteArray());

修改 旁注,ToBinary已弃用。文档建议使用BinaryDecode获取新代码。

答案 1 :(得分:0)

我能够适应我在这篇文章中找到的内容: http://www.bennadel.com/blog/1017-splitting-and-joining-a-binary-file-in-coldfusion.htm

<!--- create array to hold binaries --->
<cfset xmlBinaries = arrayNew(1)/>
<cfset xmlBinariesTotalLen = arrayNew(1)/>
<!--- append chunks --->
<cfset arrayAppend(xmlBinaries,toBinary(newBase64Chunk))/>
<!--- set up java buffer to hold binary chunks --->
                <cfset objByteBuffer = CreateObject(
                    "java",
                    "java.nio.ByteBuffer"
                    ) />

<cfloop from="1" to="#arraylen(xmlBinaries)#" index="i">
 <cfset arrayAppend(xmlBinariesTotalLen,ArrayLen(xmlBinaries[i])) />
</cfloop>

<!---allocate space in the buffer --->
<cfset arrBinFull = objByteBuffer.Allocate(
                    JavaCast(
                    "int",
                    (ArraySum(xmlBinariesTotalLen) )
                    )
                    ) />

<!---add binaries to the buffer --->
<cfloop from="1" to="#arraylen(xmlBinaries)#" index="i">
<cfset arrBinFull.Put(
                        xmlBinaries[i],
                        JavaCast( "int", 0 ),
                        JavaCast( "int", ArrayLen( xmlBinaries[i] ) )
                        ) /> 
</cfloop>


<cfset myResponse.fullBinary = arrBinFull.Array() />