gpt4 book ai didi

使用 Scala 解析带有文件上传内容的多部分 HTTP 表单数据

转载 作者:行者123 更新时间:2023-12-04 01:12:56 27 4
gpt4 key购买 nike

有很多multipart/form-data文件上传解决方案在那里,但我一直无法为 Scala 找到一个独立的解决方案。

Play2 具有此功能作为框架的一部分,Spray 还支持多部分表单数据。不幸的是,这两个似乎都很好地集成到了其余的工具集中(我可能在这里错了)。

我的服务器是使用 Finagle 开发的(目前不支持多部分表单数据),如果可能的话,我想使用独立的库或“滚动我自己的”解决方案。

这是一个典型的 multipart/form-data 消息:

--*****org.apache.cordova.formBoundary
Content-Disposition: form-data; name="value1"

First parameter content
--*****org.apache.cordova.formBoundary
Content-Disposition: form-data; name="value2"

Second parameter content
--*****org.apache.cordova.formBoundary
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg

$%^&#$%^%#$
--*****org.apache.cordova.formBoundary--

在本例中, *****org.apache.cordova.formBoundary是表单边界,所以分段上传包含 2 个文本参数和一个图像(为了清晰起见,我连接了图像数据)。

如果有人比我更了解 Scala,能给我一些关于如何解析这些内容的简要说明,我将不胜感激。

首先,我想我会很快将内容分成三部分:
data.split("\\Q--*****org.apache.cordova.formBoundary\\E") foreach println

但是执行速度特别慢(更新 - 这是由于预热时间)。有没有更有效的方法来分割零件?我的策略是将内容分成几部分,然后将部分分成子部分。这是一个糟糕的方法吗?我见过用状态机解决类似的问题吗?什么是好的函数式方法。请记住,在尝试解决问题的同时,我正在尝试学习一种正确的 Scala 方法。

更新:

我真的认为这个问题的解决方案是 Scala 中的一两行。如果有人通过巧妙的解决方案偶然发现了这个问题,请花点时间记下来。根据我的理解,可以使用模式匹配、解析组合器、提取或简单地拆分字符串来解析此消息。我正在努力寻找解决此类问题的最佳方法,因为我正在工作的一个项目涉及大量自然语言解析,我需要编写自己的自定义解析工具。我对 Scala 有了很好的理解,但没有什么比专家的建议更胜一筹了。

这不仅仅是解决问题,而是要找到解决此类问题的最佳(并且希望是最简单的)方法。

最佳答案

我很好奇你的“特别慢”实际上有多慢。我编写了以下简单的小函数来生成假消息:

def generateFakeMessage(n: Int) = {
val rand = new scala.util.Random(1L)
val maxLines = 100
val maxLength = 100

(1 to n).map(i =>
"--*****org.apache.cordova.formBoundary\n" +
"Content-Disposition: form-data; name=\"value%d\"\n\n".format(i) +
(0 to rand.nextInt(maxLines)).map(_ =>
(0 to rand.nextInt(maxLength)).map(_ => rand.nextPrintableChar).mkString
).mkString("\n")
).mkString("\n") + "\n--*****org.apache.cordova.formBoundary--"
}

接下来,我创建了一个相当大的消息用于测试:
val data = generateFakeMessage(10000)

它最终包含超过一百万行。然后我尝试了你的正则表达式:
data.split("\\Q--*****org.apache.cordova.formBoundary\\E").size

它或多或少会立即返回。您可能可以稍微调整正则表达式,如果您的数据是 Iterable[String],您可以使用更简洁的方法。超过消息的行,但我认为您不会从手动状态机中获得更好的性能来解析一个大 String .

关于使用 Scala 解析带有文件上传内容的多部分 HTTP 表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9768418/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com