如何在 Coldfusion 中解析 Multipart/mixed 数据
How to parse Multipart/mixed data in Coldfusion
我正在使用 REST 服务,该服务 returns 图像块作为 Multipart/mixed 数据的一部分。内容中可以有 1 个或多个图像。此 blob 的边界在 Content-Type 中返回。如果此多部分内容的边界是,例如:b4081556-a000-48d9-a4e5-xyz345,则响应如下所示:
--边界内容类型:image/jpeg BLOB1 --边界内容类型:image/jpeg BLOB2 --边界内容类型:image/jpeg BLOB3 --边界--
我需要将此响应解析为单独的图像文件 (blob) 并将它们显示在前端。我在 ColdFusion 上这样做,但没有成功。为了简单起见,我想首先使用一个简单的 blob 和一个图像。然后从中消除封装边界并将内容读入变量,但我不断收到此错误:
ColdFusion 无法从指定的源文件创建图像。
确保该文件是有效的图像文件。
这是我尝试提取封装边界的内容:
<cfset thumbnail_filecontent = currPageThumnail_raw_resp.fileContent.toByteArray()>
<cfset thumbnail_str = toString(thumbnail_filecontent)>
<!---remove the encapsulation boundary--->
<cfset content1 = removeChars(thumbnail_str, 1, 64)>
<cfset content2 = Left(content1, Len(content1)-43)>
<!---Convert the string into binary--->
<cfset image_content = toBinary(toBase64(content2))>
<cfimage action="INFO" source="#image_content#" structname="objImageInfo" />
<cfdump var="#objImageInfo#"><cfabort>
我也尝试使用 ImageNew(),但最终出现了同样的错误。我不确定我是否遗漏了什么。我开始怀疑从响应中提取封装边界然后处理文件内容是否是正确的(也是唯一的?)方法?
如果那是唯一的方法,那么将字节数组转换为字符串,提取图像内容然后将其转换回二进制进行处理是否是个好主意?有没有更好的办法?
这是我第一次使用多部分数据,如有任何帮助,我们将不胜感激!提前致谢。
响应屏幕截图:
感谢@Ageax 对此的帮助。非常感谢!
我的解决方案与 没有太大区别。唯一的区别是 - 我的涉及 images/thumbnails 并且正如指出的那样,它不需要嵌入 Content-Type 的边界。
<cfscript>
var path = GetDirectoryFromPath(GetCurrentTemplatePath());
destination = path & "\thumbnails\";
contentType = "multipart/mixed";
byteArrayDS = createObject("java", "javax.mail.util.ByteArrayDataSource").init(thumbnail_filecontent, contentType);
mimeMP = createObject("java", "javax.mail.internet.MimeMultipart").init(byteArrayDS);
// loop through parts
for (i = 0; i < mimeMP.getCount(); i++) {
writeOutput("<br>Processing part["& i &"]");
bodyPart = mimeMP.getBodyPart( javacast("int", i));
// **** NOTE: Update directory path ****
if (!isNull(bodyPart)) {
outputFile = createObject("java", "java.io.File").init(destination &"thumbnail"& i &".png");
bodyPart.saveFile(outputFile);
writeOutput("<br>Saved: "& outputFile.getAbsolutePath());
}
}
</cfscript>
我正在使用 REST 服务,该服务 returns 图像块作为 Multipart/mixed 数据的一部分。内容中可以有 1 个或多个图像。此 blob 的边界在 Content-Type 中返回。如果此多部分内容的边界是,例如:b4081556-a000-48d9-a4e5-xyz345,则响应如下所示: --边界内容类型:image/jpeg BLOB1 --边界内容类型:image/jpeg BLOB2 --边界内容类型:image/jpeg BLOB3 --边界--
我需要将此响应解析为单独的图像文件 (blob) 并将它们显示在前端。我在 ColdFusion 上这样做,但没有成功。为了简单起见,我想首先使用一个简单的 blob 和一个图像。然后从中消除封装边界并将内容读入变量,但我不断收到此错误:
ColdFusion 无法从指定的源文件创建图像。 确保该文件是有效的图像文件。
<cfset thumbnail_filecontent = currPageThumnail_raw_resp.fileContent.toByteArray()>
<cfset thumbnail_str = toString(thumbnail_filecontent)>
<!---remove the encapsulation boundary--->
<cfset content1 = removeChars(thumbnail_str, 1, 64)>
<cfset content2 = Left(content1, Len(content1)-43)>
<!---Convert the string into binary--->
<cfset image_content = toBinary(toBase64(content2))>
<cfimage action="INFO" source="#image_content#" structname="objImageInfo" />
<cfdump var="#objImageInfo#"><cfabort>
我也尝试使用 ImageNew(),但最终出现了同样的错误。我不确定我是否遗漏了什么。我开始怀疑从响应中提取封装边界然后处理文件内容是否是正确的(也是唯一的?)方法?
如果那是唯一的方法,那么将字节数组转换为字符串,提取图像内容然后将其转换回二进制进行处理是否是个好主意?有没有更好的办法?
这是我第一次使用多部分数据,如有任何帮助,我们将不胜感激!提前致谢。
响应屏幕截图:
感谢@Ageax 对此的帮助。非常感谢!
我的解决方案与
<cfscript>
var path = GetDirectoryFromPath(GetCurrentTemplatePath());
destination = path & "\thumbnails\";
contentType = "multipart/mixed";
byteArrayDS = createObject("java", "javax.mail.util.ByteArrayDataSource").init(thumbnail_filecontent, contentType);
mimeMP = createObject("java", "javax.mail.internet.MimeMultipart").init(byteArrayDS);
// loop through parts
for (i = 0; i < mimeMP.getCount(); i++) {
writeOutput("<br>Processing part["& i &"]");
bodyPart = mimeMP.getBodyPart( javacast("int", i));
// **** NOTE: Update directory path ****
if (!isNull(bodyPart)) {
outputFile = createObject("java", "java.io.File").init(destination &"thumbnail"& i &".png");
bodyPart.saveFile(outputFile);
writeOutput("<br>Saved: "& outputFile.getAbsolutePath());
}
}
</cfscript>