我正在使用一个返回base64块中的大文件的Web服务。当Web服务只返回1个块时,我可以使用toBinary()来转换并保存到文件中。但是当我找回大块的base64字符串时,我不知道该怎么做。简单的变量连接不起作用。是否有正确的方法在Cold Fusion中加入这些字符串然后转换为二进制文件?
<cfset masterChunk = masterChunk & theNextChunk />
<cfset binaryFile = toBinary(masterChunk) />
我得到的错误是:必须是base-64编码的字符串。
答案 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() />