Ich möchte Spray verwenden, um ein mehrteiliges Formular an einen Server zu senden. Insbesondere möchte ich ein Bild posten.Spray Client Post Multipart
Worüber ich Probleme habe, ist das Marshalling der Datei zu Multipart. Obwohl sie in Spray ihren Standard-Marshaller erwähnen, kann ich die beiden anscheinend nicht zusammenstecken.
Ich benutze derzeit Spray 1.0-M7, da ich nicht zu Scala 2.10 migriert bin, wenn das Beispiel mit diesem Zweig kompatibel wäre, wäre das wunderbar.
Was ich derzeit haben, ist dies:
val bis = new BufferedInputStream(new FileInputStream(file))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
Logger.error("About to post with spray")
pipeline(Post("/saveImageWithSpray", bArray))
Und natürlich bekomme ich eine Fehlermeldung,:
For request 'POST /saveImageWithSpray' [Missing boundary header]
Die meisten Beispiele, die ich verwenden, um die Inhalte zu finden (wie [X]) Richtlinie marshall Obwohl ich kein Spray-Routing verwende, muss ich den Post nur mit dem Spray-Client in einer Anwendung ausführen, die auf einem anderen Framework aufgebaut ist.
Dank
EDIT
Ich habe marshall tatsächlich schaffte es wie folgt aus:
val pipeline = (
addHeader("Content-Type", "multipart/form-data")
~> sendReceive(conduit)
)
val bis = new BufferedInputStream(new FileInputStream(file, "UTF-8"))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
Logger.error("About to post with spray "+bArray.length.toString)
pipeline(Post("/saveImageWithSpray", MultipartFormData(Map(
"spray-file" -> BodyPart(
HttpEntity(Some(HttpBody(ContentType(MediaTypes.`image/gif`), bArray))),
HttpHeaders.`Content-Disposition`("form-data", Map("name" -> "spray-file","filename"->"Fuurin (Glass Wind Chime).gif"))::Nil
)
))))
Leider ist dies nicht immer noch arbeitet, werden die Daten übertragen zu werden, aber der Server kann nicht finden die Datei.
A wireshark Erfassung ergibt sich folgendes Bild:
POST /saveImageWithSpray HTTP/1.1
Host: localhost:9000
User-Agent: spray-can/1.0-M7
Content-Type: multipart/form-data; boundary="oxz40rxXXQyDx+IUKcz7QYpJ"
Content-Length: 1725
--oxz40rxXXQyDx+IUKcz7QYpJ
Content-Disposition: form-data; name="spray-file"
Content-Disposition: form-data; name="spray-file"; filename="Fuurin (Glass Wind Chime).gif"
Content-Type: image/gif
GIF89a0.0..........
BINARY DATA
..P...L0..8.....X.....l..?...;
--oxz40rxXXQyDx+IUKcz7QYpJ--HTTP/1.1 500 Internal Server Error
Content-Type: text/plain; charset=utf-8
Content-Length: 25
File not found spray-file
Dies ist eine Erfassung eines gültigen Antrag mit einem erweiterte Ruhe Auftraggeber:
POST /saveImageWithSpray HTTP/1.1
Host: localhost:9000
Connection: keep-alive
Content-Length: 2573
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryuiIgwVg3rBQLFNGB
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
------WebKitFormBoundaryuiIgwVg3rBQLFNGB
Content-Disposition: form-data; name="spray-file"; filename="Gunsen (Fan) .gif"
Content-Type: image/gif
GIF89a0.0.........u.QQ..Z..z.wW[[[.
BINARY DATA
.....&...Z(.c.Q.....T.B7..S...!...p[...8."...;
------WebKitFormBoundaryuiIgwVg3rBQLFNGB--
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 24
File uploaded with spray
Es scheint einen Mangel des aktuellen MultipartFormData-Marshallers zu geben, der 'Dateiname'-Parameter nicht unterstützt. Ich habe ein Problem erstellt, um dies zu verfolgen: https://github.com/spray/spray/issues/327 – jrudolph
Also @dgrandes ... hat Ihr Fix funktioniert? Ist der Name der Spraydatei Ihres Formular-Datenelements? Ich habe ein ähnliches Problem mit 2 Form-Datenelementen: eine Text/CSV-Datei und und Autorisierungszeichenfolge. Haben Sie die Begrenzungszeichenfolge selbst erstellt? Danke – iyerland
Sorry @iyerland, ich habe die Sprühlösung aufgegeben und direkt in Play umgesetzt! Rahmen. Es tut uns leid! – dgrandes