【问题标题】:How to parse Multipart/mixed data in Coldfusion如何在 Coldfusion 中解析多部分/混合数据
【发布时间】:2019-09-23 19:48:39
【问题描述】:

我正在使用一个 REST 服务,该服务返回一个图像块作为多部分/混合数据的一部分。内容中可以有 1 个或多个图像。此 blob 的边界在 Content-Type 中返回。如果此多部分内容的边界是,例如:b4081556-a000-48d9-a4e5-xyz345,则响应如下所示: --boundary Content-Type: image/jpeg BLOB1 --boundary Content-Type: image/jpeg BLOB2 --boundary Content-Type: image/jpeg BLOB3 --boundary--

我需要将此响应解析为单个图像文件(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(),但最终出现了同样的错误。我不确定我是否遗漏了什么。我开始怀疑从响应中提取封装边界然后使用文件内容是正确的(也是唯一的?)方法吗?

如果这是唯一的方法,那么将字节数组转换为字符串,提取图像内容,然后将其转换回二进制进行处理是个好主意吗?有没有更好的办法?

这是我第一次使用 Multipart 数据,我们将不胜感激!提前致谢。

回复截图:

【问题讨论】:

  • 刚刚做了,谢谢:)
  • 编辑:"...响应看起来像这样.." 您能否发布响应的屏幕截图?可能有比diy更好的解析方式。
  • 尝试使用类似的方法为您解析响应。循环通过零件# 以提取每个图像。该线程将内容保存到文件中,但您也可以在内存中执行此操作。 stackoverflow.com/questions/43594950/…
  • 顺便说一句,我不确定你是否需要预先知道边界值,就像那个线程暗示的那样。根据响应格式,您可能能够摆脱从二进制创建 ByteArrayDataSource 并使用“multipart/mixed”(无边界)类型的内容
  • 是的。并非每个任务都需要 Java,但在这种情况下,它是适合该工作的工具,因为它已经确定了所有格式和解析规则。很高兴你成功了!

标签: arrays coldfusion blob multipart cfimage


【解决方案1】:

感谢@Ageax 对此的帮助。非常感谢!

我的解决方案与this 没有太大区别。唯一的区别在于图像/缩略图,并且正如指出的那样,它不需要嵌入 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>

【讨论】:

  • 另外,如果您收到混合图像类型,您可以使用bodyPart.isMimeType("type/subtype") 等方法来确定适当的文件扩展名。
  • 这是一个有用的提示。我相信响应会返回 jpg 和 png。再次感谢:)
猜你喜欢
  • 2016-11-08
  • 2011-04-11
  • 2021-12-24
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2016-02-01
相关资源
最近更新 更多