Разбор составных данных HTTP-формы с содержимым загрузки файлов с использованием Scala

Существует множество multipart/form-dataрешений для загрузки файлов, но я не смог найти отдельно стоящего решения для Скала.

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, но ничто не сравнится с советом эксперта.

Речь идет не только о решении проблемы, но и о поиске наилучшего (и, надеюсь, самого простого) возможного способа решения такого рода проблем.

12
задан Jack 30 March 2012 в 06:33
поделиться