【发布时间】:2012-03-19 10:19:23
【问题描述】:
那里有很多multipart/form-data 文件上传解决方案,但我无法为 Scala 找到一个独立的解决方案。
Play2 将此功能作为框架的一部分,Spray 还支持多部分表单数据。不幸的是,这两个似乎都很好地集成到了其余的工具集中(我可能在这里错了)。
我的服务器是使用 Finagle 开发的(目前不支持多部分表单数据),如果可能的话,我想使用一个独立的库或“滚动我自己的”解决方案。
这是一个典型的多部分/表单数据消息:
--*****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 有了很好的了解,但没有什么比专家的建议更好的了。
这不仅仅是解决问题,而是要找到解决此类问题的最佳(希望是最简单的)方法。
【问题讨论】:
-
你可以在这里找到播放代码github.com/playframework/Play20/blob/master/framework/src/play/… 似乎可以理解
-
感谢@Paul。我看了一下播放代码,谢谢你的链接。我确实了解其中的大部分内容,但是对于我正在尝试做的事情来说有点复杂。我只是在寻找最简单的方法来分解上面的三个数据包并访问每个数据包的内容。某种基于正则表达式的嵌套拆分可以解决问题?
-
我建议重新命名这个问题 - 我已经忽略了一段时间,因为它特定于文件上传和事情,而它似乎是解析的一般问题。我已经重新标记以表明这一点,但明确说明它是关于编写解析器的标题可能会吸引更多回复。
-
你说得很好,谢谢@submonoid。我改变了标题。