2013-06-12 15 views
6

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 
+2

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

+0

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

+0

Sorry @iyerland, ich habe die Sprühlösung aufgegeben und direkt in Play umgesetzt! Rahmen. Es tut uns leid! – dgrandes

Antwort

Verwandte Themen