Ich benutze Angular ng-file-upload
() auf dem Frontend, um den Datei-Upload-Prozess zu verwalten.Scala Play Framework Bild hochladen mit Angular ng-Datei-Upload
Leider enthält Formular ein komplexes Objekt mit mehreren Dateien. Mit der MultipartFormData
(https://www.playframework.com/documentation/2.5.x/ScalaBodyParsers) auf der Serverseite habe ich den hochgeladenen Inhalt erfolgreich zerlegt und kann es aus der request.body
lesen.
Nun zu meiner Überraschung, ich habe keine einfaches Json Objects
sondern einen seltsam geformten Datentyp, auf der ng-file-upload
Webseite wie folgt beschrieben:
(...) Server-Implementierungen verschachtelten Datenobjektschlüssel erwarten in .key oder [key] Format. Beispiel: Daten: {rec: {Name: 'N', Bild: Datei}} gesendet als: rec [Name] -> N, rec [Bild] -> Datei
Daten: {rec: {name: 'N 'pic: file}, objectKey:' .k '} als gesendet: rec.name -> N, rec.pic -> Datei
Bisher habe ich es geschafft, alle Daten auf einen gemeinsamen MultipartFormData.Part
zu bringen Typ, mit dem DataPart
und FilePart
wie folgt aus:
val opts = body.dataParts.map {
case (key, values) => DataPart(key, values.head)
}
val parts = opts ++ body.files
So bin ich jetzt links mit einem sehr bedauerlich Iterable[Part]
:
0 = {[email protected]} "DataPart(arabic[active],false)"
1 = {[email protected]} "DataPart(english[active],true)"
2 = {[email protected]} "DataPart(english[url],2132132132)"
...
7 = {[email protected]} "FilePart(english[image],fb_icon_325x325.png,Some(image/png),TemporaryFile(/tmp/playtemp5909927824995768544/multipartBody8348573128070542611asTemporaryFile))"
Jedes Objekt name
enthält das key
seiner Json-Struktur und seine entsprechende value
. Anstatt nun key[level1][level2]
würde Ich mag es, um Objekte zu analysieren, in meinem Fall:
case class PcBanner(english: PcBanners, arabic: PcBanners, kurdish: PcBanners)
case class PcBanners(active: Boolean, url: Option[String], image: Option[String])`
Ich hoffe, Sie auf die Idee kommen.
Die Frage
Ich weiß, ich könnte versuchen, die name
Strings zu analysieren versucht, es zu Objekten passen, aber ich glaube, ich in der Mitte irgendwie einen Fehler gemacht. Gibt es eine Möglichkeit, diese Struktur in die Objekte zu analysieren, indem Sie Feldnamen als Referenz verwenden? Irgendwelche Build in Play Funktionen oder ähnliches?
Vielen Dank für Ihre Hilfe!
Der Grund, warum die Daten so gesendet werden, ist, dass es sich um eine mehrteilige/Formulardatenanforderung handelt. Stellen Sie es sich als ein HTML-Formular mit einigen Eingabe-Schlüssel/Wert-Paaren vor, deren Wert eine Zeichenfolge ist. Eine Alternative wäre, Ihre Daten mit 'JSON.stringify()' in json string zu konvertieren und dann auf dem Server diese Zeichenfolge zu lesen und Server-Bibliotheken zu verwenden, um die json-Zeichenfolge in Modellobjekte zu konvertieren. – danial
@danial Ich habe zwar von 'JSON.stringify()' vorher, aber ich bin mir nicht sicher, wie man das Bild in die 'JSON' passt. Soll ich die Bytes nur als String senden? – Atais
Nein, die Datei muss separat wie folgt gesendet werden '{Datei: file, otherData: JSON.stringify (myData)}' – danial