2009-10-02 13 views
5

मैं अपनी वेबसाइट पर एक क्लोजर एपीआई बना रहा हूं जो मूल रूप से मूल वेब एपीआई के आसपास एक रैपर है। उन सुविधाओं में से एक जो मैं लागू करने में सक्षम नहीं हूं, POST अनुरोधों के माध्यम से फ़ाइल भेज रहा है, मूल रूप से मैं curl -F foo=bar [email protected] foobar.com के साथ खोल में क्या करूंगा।मैं एक POST अनुरोध में एक फ़ाइल कैसे भेज सकता हूं?

मैं clojure-http-client का उपयोग कर रहा हूं, और शुरुआत में (resourcefully/post "foobar.com" {} {:foo "bar" :baz (File. "bak.jpg")}) फॉर्म का प्रयास किया, लेकिन: बाज़ फ़ील्ड को प्राप्त करने वाली स्क्रिप्ट द्वारा अनदेखा किया गया था, जैसे कि मैंने केवल भेजा था: foo। बाद में, मैंने FileInputStream को File. बदलते कोशिश की है, के रूप में [लाइन 51] [2] client.clj के इस विशेष वर्ग के लिए जाँच किया जा रहा है, लेकिन अभी भी एक ही परिणाम मिला है।

तो मैं एक php पृष्ठ कि बस $ _POST प्रिंट मेरे अनुरोध की जाँच करने के लिए बनाया है, और जाहिरा तौर पर वस्तुओं के डेटा सचमुच भेजा जा रहा है।

Clojure => (साधन-/ पोस्ट "http://ptchan.org/pttest.php" {} {: foo "बार": baz "/tmp/bak.jpg"}) {: शरीर-सेक ("सरणी" एक नजर डालें "(" "[foo] => बार" "[baz] => /tmp/bak.jpg" ")"), कोड 200,: msg "ठीक", विधि "पोस्ट", हेडर {: तिथि ("शुक्र, 02 अक्टूबर 200 9 11:41:15 जीएमटी"),: भिन्न ("स्वीकृति-एन्कोडिंग"), सामग्री-लंबाई ("53"),: कनेक्शन ("बंद करें"): सामग्री-प्रकार (" पाठ/एचटीएमएल "),: सर्वर (" अपाचे/2.2.9 (डेबियन) PHP/5.2.6-1 + लेनी 3 सुहोसिन-पैच के साथ "): x-powered-by (" PHP/5.2.6-1 + lenny3 ")},: प्राप्त हेडर #,: कुकीज़ शून्य,: यूआरएल" http://ptchan.org/pttest.php "}

Clojure => (साधन-/ पोस्ट" http://ptchan.org/pttest.php "{} {: foo" बार ":। baz (फ़ाइल"/tmp/bak.jpg ")}) {: शरीर-सेक ("सरणी" "(" "[foo] => बार" "[baz] => /tmp/bak.jpg" ")"),: कोड 200,: msg "ठीक है",: विधि "पोस्ट", हेडर {: दिनांक ("शुक्र, 02 अक्टूबर 200 9 11:41:30 जीएमटी"),: भिन्न ("स्वीकृति-एन्कोडिंग"), सामग्री-लंबाई ("53"),: कनेक्शन (" बंद करें "), सामग्री-प्रकार (" टेक्स्ट/एचटीएमएल "),: सर्वर (" अपाचे/2.2.9 (डेबियन) PHP/5.2.6-1 + लेनी 3 सुहोसिन-पैच के साथ "): x-powered-by ("PHP/5.2.6-1 + lenny3")},: हेडर-हेडर #,: कुकीज़ शून्य,: यूआरएल "http://ptchan.org/pttest.php"}

क्लोजर => (संसाधन/पोस्ट करें "http://ptchan.org/pttest.php" {} {: foo "बार": बाज़ (FileInputStream। "/tmp/bak.jpg")}) {: शरीर-सेक ("सरणी" "(" "[foo] => बार" "[baz] => [email protected]" ")") ,: कोड 200,: msg "ठीक",: विधि "पोस्ट", हेडर {: दिनांक ("शुक्र, 02 अक्टूबर 200 9 11:41:47 जीएमटी"),: भिन्न ("स्वीकृति-एन्कोडिंग"), सामग्री -लम्बाई ("73"),: कनेक्शन ("बंद करें"), सामग्री-प्रकार ("पाठ/एचटीएमएल"),: सर्वर ("अपाचे/2.2.9 (डेबियन) PHP/5.2.6-1 + lenny3 के साथ Suhosin-पैच "),: एक्स संचालित-दर (" PHP/5.2.6-1 + lenny3 ")},: प्राप्त हेडर #,: कुकीज़ शून्य,: यूआरएल" http://ptchan.org/pttest.php "}

मैं वास्तव में यह सुनिश्चित नहीं है कि कैसे आगे बढ़ना है। कोई उपाय? डीबगिंग पर सामान्य सुझाव भी स्वागत है!

धन्यवाद

+2

+1। ^^ – KB22

उत्तर

4

clojure-apache-http, पूर्ण विशेषताओं अपाचे HTTP पुस्तकालयों के लिए एक Clojure आवरण का उपयोग करें। यह मल्टीपार्ट/फॉर्म-डेटा पोस्ट का समर्थन करता है। लिस्प का उपयोग करने के लिए

3

मुझे यकीन है कि यह clojure-http-क्लाइंट का उपयोग संभव है नहीं कर रहा हूँ। जहां तक ​​मैं in the source code देखता हूं, यदि आप शरीर के तर्क के रूप में एक नक्शा पास करते हैं, तो यह यूआरएल प्रत्येक तत्व को एन्कोड करेगा और इसे भेज देगा। ऐसा प्रतीत होता है कि आप बिना किसी अन्य तर्क के पूरे फाइलों के रूप में फाइलों को पोस्ट कर सकते हैं। मल्टीपार्ट के लिए तो एनयू समर्थन।

(let [out (.getOutputStream connection)] 
(cond 
    (string? body) (spit out body) 
    (map? body) (spit out (url-encode body)) 
    (instance? InputStream body) 
    (let [bytes (make-array Byte/TYPE 1000)] 
    (loop [#^InputStream stream body 
      bytes-read (.read stream bytes)] 
     (when (pos? bytes-read) 
     (.write out bytes 0 bytes-read) 
     (recur stream (.read stream bytes)))))) 
(.close out))) 
संबंधित मुद्दे