Chcę użyć narzędzia Spray, aby wysłać do serwera formularz wieloczęściowy. W szczególności chcę opublikować zdjęcie.Klient w sprayu Post Multipart
To, z czym mam problem, to zblokowanie pliku na wieloczęściowy. Mimo że w Sprayu wspominają swojego domyślnego Marshallera, po prostu nie mogę połączyć tych dwóch elementów razem.
Im obecnie używam Sprayu 1.0-M7, ponieważ nie migrowałem do Scala 2.10, gdyby przykład mógł być zgodny z tą gałęzią, byłoby wspaniale.
Co obecnie mam to:
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))
I oczywiście pojawia się błąd mówiący:
For request 'POST /saveImageWithSpray' [Missing boundary header]
Większość przykładów znajdę korzystania z takich materiałów (w postaci [X]) dyrektywy Marshall , ale nie używam routingu natryskowego, wystarczy, że wykonam post za pomocą klienta sprayu w aplikacji zbudowanej na innym frameworku.
Dzięki
EDIT
I rzeczywiście udało się Marshall to tak:
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
)
))))
Niestety to nie działa nadal, dane są coraz przeniesione ale serwer nie może znaleźć plik.
Wireshark przechwytywania ujawnia, co następuje:
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
To uchwycenia ważnego wniosku złożonym z zaawansowanym Rest Klienta:
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
Wygląda na to, że obecny jest niedobór aktualnego multipartFormData, który nie obsługuje parametrów 'filename'. Stworzyłem problem do śledzenia: https://github.com/spray/spray/issues/327 – jrudolph
So @dgrandes ... czy twoja poprawka zadziałała? Czy nazwa pliku-rozpylacza jest elementem formularza? Mam podobny problem z 2 elementami danych formularza: tekstem/plikiem csv i ciągiem autoryzacji. Czy sam stworzyłeś sznur graniczny? Dzięki – iyerland
Sorry @yerland, skończyło mi się porzucenie rozwiązania w sprayu i zaimplementowałem je bezpośrednio w Play! Struktura. Przepraszam! – dgrandes