अपाचे कैमल HTTP घटक का उपयोग करके मैं मल्टीपार्ट फ़ाइल अपलोड कैसे कर सकता हूं?अपाचे कैमल मल्टीपार्ट HTTP पोस्ट (फ़ाइल अपलोड)
उत्तर
मैं नहीं जानता कि यह संभव HTTP घटक का उपयोग बहुखण्डीय रूपों भेजने के लिए है।
यदि आपको कामकाज की आवश्यकता है, तो आप पीओजेओ स्प्रिंग बीन बना सकते हैं जो अपाचे एचटीपी क्लाइंट (और इसके MultipartPostMethod
) का उपयोग करता है। तो फिर तुम मार्ग कि सेम के लिए अपने संदेश कर सकते हैं:
from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")
क्या इसे ऊंट का उपयोग करना है?
अपाचे FileUpload करता है यह काफी बस http://commons.apache.org/fileupload/using.html
हां, यह ऊंट होना है। इसके अलावा, अपाचे फ़ाइलअपलोड एक सर्वर साइड घटक है। मुझे ऊंट से फ़ाइलों को एक सर्वर पर अपलोड करने की आवश्यकता है जो पहले से ही बहु पार्ट अपलोड को संसाधित करने के बारे में जानता है। मैंने एक अलग बीन में अपलोड हिस्से को encapsulating का सहारा लिया है। यह अच्छा होगा हालांकि यह बॉक्स से बाहर काम करता है। –
आप अधिक जानकारी प्रदान कृपया सकते हैं आप कैसे चाहते हैं बहुखण्डीय रूप अपाचे ऊंट तक पहुँचने?
क्या यह वेबपृष्ठ पर कुछ रूप होना चाहिए जो सीधे कैमेल मार्ग पर भेजता है? या एएमक्यू कतार? मैं आपको Apache HTTP और Apache Jetty घटकों की जांच करने का सुझाव दूंगा।
जब तक आपका संदेश शरीर मल्टीपार्ट/फॉर्म-डेटा प्रारूप में है, तब तक आप इसे अन्य सर्वर पर पोस्ट करने के लिए ऊंट http घटक का उपयोग कर सकते हैं।
<route>
<from uri="direct:start"/>
<setBody>
<![CDATA[
--__MyCoolBoundary__
Content-Disposition: form-data; name="name"
Paul Mietz Egli
--__MyCoolBoundary__
Content-Disposition: form-data; name="email"
[email protected]
--__MyCoolBoundary__--
]]>
</setBody>
<setHeader headerName="Content-Type">
<constant>multipart/form-data; boundary="__MyCoolBoundary__"</constant>
</setHeader>
<setHeader headerName="CamelHttpMethod">
<constant>POST</constant>
</setHeader>
<to uri="http://www.example.com/mywebservice.php"/>
</route>
जाहिर है, उदाहरण के शरीर के ऊपर नहीं है कि उपयोगी यह सब स्थिर डेटा है, क्योंकि है: चाल आपके सामग्री प्रकार ठीक से सेट और अनुरोध विधि सेट पोस्ट होने के लिए करना है। शरीर के निर्माण के कई तरीके हैं - मैंने टेक्स्ट मोड में एक्सएसएलटी आउटपुटिंग का उपयोग किया है, एक स्क्रिप्टेड अभिव्यक्ति (उदा। < ग्रोवी> ... </ग्रोवी>), और एक वसंत बीन। XSLT अच्छी तरह से काम करता है जब अपने आने वाले संदेश के मुख्य भाग पहले से ही एक XML दस्तावेज है:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
--__MyCoolBoundary__
Content-Disposition: form-data; name="name"
<xsl:value-of select="//name"/>
--__MyCoolBoundary__--
</xsl:stylesheet>
आप अतिरिक्त व्हाइट के बारे में सावधान रहने की लेकिन जरूरत नहीं है। उम्मीद है की यह मदद करेगा!
मैं नीचे से एक वेब परियोजना पर काम कर दिया था विशेषताएं:
लॉग इन प्रपत्र: लोगों के लिए लॉग इन और फाइल को अपलोड कर सकते हैं; (ऊंट: जेट्टी, एचटीपी, जेडीबीसी)
अपलोड फॉर्म; अपलोड सर्वलेट: अगर लोग लॉगिन कर सकते हैं; xml फ़ाइल को ftp या वेब सर्वर पर अपलोड कर सकते हैं; (कैमल: फ़ाइल)
3.File मेरी .XSD फ़ाइल द्वारा मान्य है; (ऊंट: वैलिडेटर)
- फ़ाइल मेरी .xsl स्कीमा फ़ाइल द्वारा जांच की जाती है; (ऊंट: एक्सएसएलटी)
मैं अपने पसंदीदा आईडीई (इंटेलिजे आईडीईए Jetbrains) द्वारा वेब प्रोजेक्ट बना रहा था; मैं स्रोत परिदृश्य के साथ अपने परिदृश्य के हिस्से का वर्णन करता हूं और आशा करता हूं कि यह उपयोगी है ☺
1) अनुक्रमणिका।एचटीएमएल
<form action="http://0.0.0.0:8080/hello" method="post">
<fieldset title="Login" >
username:<input type="text" id="user" name="user"/>
password:<input type="password" id="pass" name="pass" />
<input type="submit" id="submit" value="submit"/>
</fieldset>
सबसे पहले आप डेटाबेस और प्रवेश तालिका बनाने के लिए है, फिर कुछ नमूना डेटा जोड़ें; उदाहरण के लिए इन फ़ाइलों को जोड़ें:
2) schema.sql
DROP TABLE IF EXISTS CONTACT;
CREATE TABLE CONTACT (
ID INT NOT NULL AUTO_INCREMENT
, NAME VARCHAR(40) NOT NULL
, USERNAME VARCHAR(40) NOT NULL
, PASSWORD VARCHAR(60) NOT NULL
, VERSION INT NOT NULL DEFAULT 0
, UNIQUE UQ_CONTACT_1 (USERNAME)
, PRIMARY KEY (ID));
3) परीक्षण data.sql
insert into contact (name, username, password) values ('ali', 'aliti', '123');
insert into contact (name, username, password) values ('shahab', 'shahab', '147');
insert into contact (name, username, password) values ('farhad', 'farhad', '159');
4) config वसंत-context.xml
फिर , आप एम्बेडेड डेटाबेस जैसे डर्बी, एच 2, माइस्क्ल या अन्य का उपयोग कर सकते हैं। config नीचे अपना वसंत कॉन्फ़िग फ़ाइल में जोड़ें:
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:schema.sql"/>
<jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>
5) ऊंट-context.xml
अब, आप अपने प्रोजेक्ट चला सकते हैं; इससे पहले कि आप अपने ऊंट संदर्भ के लिए इस मार्ग को जोड़ने के लिए है कि कार्य करें:
<route>
<from uri="jetty:http://0.0.0.0:8080/hello"/>
<setBody>
<simple>
select * from contact where USERNAME = '${in.header.user}' and PASSWORD = '${in.header.pass}'
</simple>
</setBody>
<to uri="jdbc:dataSource"/>
<process ref="loginProcessor"/>
<log message=">>>header: ${in.header.name}"/>
<choice>
<when>
<simple>${in.header.name} == null</simple>
<to uri="jetty://http://localhost:9090/fail.html?bridgeEndpoint=true"/>
</when>
<otherwise>
<to uri="jetty://http://localhost:9090/file.html?bridgeEndpoint=true"/>
</otherwise>
</choice>
जब आप हमारे प्रोजेक्ट को चलाने; index.html पृष्ठ दिखाया गया था और आप उपयोगकर्ता नाम और पासवर्ड टेक्स्ट बॉक्स डाल सकते हैं और अपना फॉर्म भेज सकते हैं।
दरअसल ऊंट इस जेटी बंदरगाह को सुन रहा था और आपकी पोस्ट जानकारी मिली। आप इन जानकारी को Camel के शीर्षलेख जैसे '$ {in.header.user}' से प्राप्त कर सकते हैं।
जैसा कि आप देख सकते हैं, मैंने कैमेल के बॉडी में अपनी चयन क्वेरी सेट की है, इस प्रकार चयन परिणाम कैमल बॉडी में भी स्टोर किया जाता है। मैं अपने परिणाम पढ़ना चाहते हैं और मिल गया कुछ निर्णय, इस कारण के लिए मैं नीचे के रूप में ऊंट प्रोसेसर जोड़ें:
6) LoginProcessor.java
public class LoginProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
int size = ((ArrayList) exchange.getIn().getBody()).size();
if (size > 0) {
Object name = ((LinkedHashMap) (((ArrayList) exchange.getIn().getBody()).get(0))).get("NAME");
System.out.println("welcome user: " + name);
exchange.getOut().setHeader("name",name);
} else {
System.out.println("user or pass are invalid. ");
exchange.getOut().setHeader("name",null);
}
}
}
LoginProcessor में मैं शरीर की जाँच की और अगर इनपुट उपयोगकर्ता नाम और पासवर्ड मान्य हैं; तालिका के फील्ड नाम से 'नाम' द्वारा ऊंट की हेडर संपत्ति जोड़ें और नाम दें। अन्यथा ऊंट की शीर्षलेख संपत्ति में शून्य मान सेट करें।
ऊंट संदर्भ xml फ़ाइल पर वापस जाएं और मार्ग जारी रखें। यदि ऊंट का हेडर शून्य है; fail.html पृष्ठ पर उपयोगकर्ता को रीडायरेक्ट करें; अन्यथा उस पृष्ठ पर रीडायरेक्ट करें जो उपयोगकर्ता (file.html) से फ़ाइल प्राप्त करता है।
नोट: ब्रिज एंडपॉइंट संपत्ति आप ब्रिज एंडपॉइंट के लिए http एंडपॉइंट सेट कर रहे हैं जिसका अर्थ है कि अनुरोध यूआरएल अनुरोध यूआरआई के साथ अपडेट किया जाएगा।
धन्यवाद, यही वह है जो मैंने अनिवार्य रूप से किया है। यह अब काम करता है। –
@KaiSternad: क्या आप समझा सकते हैं कि आपने इसे कुछ विस्तार से कैसे किया? –
@ अभिषेक रंजन मुझे खेद है, दुर्भाग्य से मुझे विवरण याद नहीं है। इसे बीते एक अर्सा हो गया है। –