2013-06-12 5 views
6

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

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

+0

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

+0

Sorry @yerland, skończyło mi się porzucenie rozwiązania w sprayu i zaimplementowałem je bezpośrednio w Play! Struktura. Przepraszam! – dgrandes

Odpowiedz