2013-06-12 8 views
6

मैं एक मल्टीपार्ट फॉर्म सर्वर पर पोस्ट करने के लिए स्प्रे का उपयोग करना चाहता हूं। विशेष रूप से मैं एक छवि पोस्ट करना चाहता हूँ।स्प्रे क्लाइंट पोस्ट मल्टीपार्ट

मुझे किस समस्या का सामना करना पड़ रहा है, फाइल के मार्शलिंग को मल्टीपार्ट करना है। भले ही स्प्रे में वे इसका एक डिफ़ॉल्ट मार्शलर का जिक्र करते हैं, मैं बस दोनों को एक साथ प्लग नहीं कर सकता।

मैं वर्तमान में स्प्रे 1.0-एम 7 का उपयोग कर रहा हूं क्योंकि मैं स्कैला 2.10 में माइग्रेट किया गया है, अगर उदाहरण उस शाखा के अनुरूप हो सकता है, तो यह अद्भुत होगा।

यह क्या मैं वर्तमान में है:

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)) 

और निश्चित रूप से मैं कह रहा कोई त्रुटि मिलती है:

For request 'POST /saveImageWithSpray' [Missing boundary header] 

अधिकांश उदाहरण मैं (के रूप में [X]) मार्शल के निर्देश सामग्री का उपयोग लगता है , फिर भी मैं स्प्रे-रूटिंग का उपयोग नहीं कर रहा हूं, मुझे सिर्फ एक अन्य ढांचे पर बनाए गए एप्लिकेशन में स्प्रे-क्लाइंट का उपयोग करके पोस्ट निष्पादित करने की आवश्यकता है।

धन्यवाद

संपादित

मैं वास्तव में इस तरह यह मार्शल में कामयाब रहे:

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 
    ) 
)))) 

दुर्भाग्य से यह अभी भी काम नहीं कर रहा है, डेटा स्थानान्तरित हो रहा है लेकिन सर्वर नहीं कर सकते लगता है फ़ाइल।

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 

यह एक उन्नत बाकी क्लाइंट के साथ किए गए एक वैध अनुरोध का एक पर कब्जा है: जवाब देने के लिए

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

वर्तमान मल्टीपार्टफॉर्मडाटा मार्शलर की कमी की प्रतीत होती है, जो 'फ़ाइल नाम' पैरामीटर का समर्थन नहीं करती है। मैंने इसे ट्रैक करने के लिए एक समस्या बनाई: https://github.com/spray/spray/issues/327 – jrudolph

+0

तो @dgrandes ... क्या आपका फ़िक्स काम किया? क्या आपके फॉर्म-डेटा तत्व का स्प्रे-फ़ाइल नाम है? मुझे एक समान समस्या है, 2 फॉर्म-डेटा तत्वों के साथ: एक टेक्स्ट/सीएसवी फ़ाइल और प्राधिकरण स्ट्रिंग। क्या आपने सीमा स्ट्रिंग स्वयं बनाया है? धन्यवाद – iyerland

+0

क्षमा करें @ मयूरलैंड, मैंने स्प्रे समाधान को त्याग दिया और सीधे प्ले में लागू किया! फ्रेमवर्क। माफ़ कीजिये! – dgrandes

उत्तर

1

@grandes धन्यवाद

एक wireshark कब्जे के बाद पता चलता है। मैंने http अनुरोध भेजने के लिए न्यूमैन आराम क्लाइंट लाइब्रेरी (https://github.com/stackmob/newman) का उपयोग किया, लेकिन मैन्युअल रूप से मल्टीपार्टफॉर्मडेटा बनाना था और यह काम करता था। यह निकट भविष्य में नए व्यक्ति में तय किया जाएगा। यहां लिंक है जिसे मैंने मैन्युअल रूप से मल्टीपार्ट फॉर्म डेटा बनाने के लिए उपयोग किया था: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

संबंधित मुद्दे