Existen muchas soluciones de carga de archivos multipart/form-data, pero no he podido encontrar una de forma gratuita para Scala.Analizando datos de formularios HTTP de varias partes con contenido de carga de archivos usando Scala
Play2 tiene esta funcionalidad como parte del marco y Spray también admite datos de formularios de varias partes. Lamentablemente, ambos parecen estar bastante integrados en el resto de los conjuntos de herramientas (puedo estar equivocado aquí).
Mi servidor ha sido desarrollado utilizando Finagle (que actualmente no es compatible con datos de formularios de varias partes), y si es posible, me gustaría utilizar una solución libre o 'rodar por mi cuenta'.
Este es un mensaje típico 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--
En este ejemplo, *****org.apache.cordova.formBoundary
es la forma límite, por lo que la carga de varias contiene 2 parámetros de texto y una imagen (I concatenan los datos de imagen para claridad).
Si alguien que conoce a Scala mejor que yo puede darme un poco de un resumen sobre cómo abordar el análisis de este contenido, le estaré muy agradecido.
Para empezar, pensé que iba a dividir rápidamente el contenido de cada tres haciendo:
data.split("\\Q--*****org.apache.cordova.formBoundary\\E") foreach println
Pero la ejecución es notablemente lenta (actualización - esto era debido al tiempo de calentamiento). ¿Hay una manera más eficiente de dividir las partes? Mi estrategia es dividir el contenido en partes y dividir las partes en subpartes. ¿Es este un enfoque horrible? ¿He visto problemas similares que se resuelven con las máquinas de estado? ¿Cuál es un buen enfoque funcional? Tenga en cuenta que estoy tratando de aprender un enfoque adecuado para Scala al tratar de resolver el problema.
Actualización:
Realmente pensó que una solución a este problema sería una línea o dos en Scala. Si alguien se tropieza con esta pregunta con una solución ingeniosa, tómese el tiempo para anotarla. Desde mi punto de vista, uno podría analizar este mensaje usando la coincidencia de patrones, el análisis de los combinadores, la extracción o simplemente dividiendo la cadena. Estoy tratando de encontrar la mejor manera de resolver este tipo de problema, ya que un proyecto en el que estoy trabajando implica una gran cantidad de análisis de lenguaje natural, y tengo que escribir mis propias herramientas de análisis personalizadas. Entiendo bien Scala, pero nada supera el consejo de un experto.
No se trata solo de resolver el problema, se trata de encontrar la mejor (y afortunada, la más simple) forma de resolver este tipo de problema.
Puede encontrar el código Play aquí https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/ mvc/ContentTypes.scala Parece razonablemente comprensible –
Gracias @Paul. Eché un vistazo al código de juego, gracias por el enlace. Entiendo la mayor parte, sin embargo, es un poco complicado para lo que estoy tratando de hacer. Solo busco la manera más simple de separar los tres paquetes de datos anteriores y acceder al contenido de cada paquete. ¿Algún tipo de división anidada basada en expresiones regulares puede hacer el truco? – Jack
Sugeriría volver a plantear esta pregunta: lo he ignorado por un tiempo como específico para la carga de archivos y cosas, mientras que parece ser una pregunta general sobre el análisis sintáctico. He repetido para indicar esto, pero un título que deja en claro que se trata de escribir un analizador probablemente atraerá más respuestas. – Submonoid