2010-07-26 11 views
54

में इनकमिंग मल्टीपार्ट/फॉर्म-डेटा पैरामीटर को पार्स करने का सुविधाजनक तरीका आने वाले अनुरोध से डेटा को पढ़ने और विश्लेषण करने का कोई सुविधाजनक तरीका है।Servlet

उदा ग्राहक पोस्ट अनुरोध

URLConnection connection = new URL(url).openConnection(); 
connection.setDoOutput(true); 
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); 
PrintWriter writer = null; 
try { 
    OutputStream output = connection.getOutputStream(); 
    writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important! 
    // Send normal param. 
    writer.println("--" + boundary); 
    writer.println("Content-Disposition: form-data; name=\"param\""); 
    writer.println("Content-Type: text/plain; charset=" + charset); 
    writer.println(); 
    writer.println(param); 

आरंभ मैं request.getParameter("paramName") का उपयोग कर परम प्राप्त करने में सक्षम नहीं हूँ। निम्नलिखित कोड

BufferedReader reader = new BufferedReader(new InputStreamReader(
    request.getInputStream())); 
    StringBuilder sb = new StringBuilder(); 
    for (String line; (line = reader.readLine()) != null;) { 
    System.out.println(line); 

    } 

लेकिन मुझे

-----------------------------29772313742745 
Content-Disposition: form-data; name="name" 
J.Doe 
-----------------------------29772313742745 
Content-Disposition: form-data; name="email" 
[email protected] 
-----------------------------29772313742745 

भेजे अनुरोध को पार्स करने के लिए सबसे अच्छा तरीका क्या है के लिए सामग्री प्रदर्शित करता है? मैं अपना खुद का पार्सर नहीं लिखना चाहता, शायद एक तैयार समाधान है।

उत्तर

71

multipart/form-data एन्कोडेड अनुरोध वास्तव में संस्करण 3.0 से पहले सर्वलेट एपीआई द्वारा समर्थित डिफ़ॉल्ट रूप से नहीं हैं। Servlet API application/x-www-form-urlencoded एन्कोडिंग का उपयोग कर डिफ़ॉल्ट रूप से पैरामीटर को पार करता है। एक अलग एन्कोडिंग का उपयोग करते समय, request.getParameter() कॉल सभी null लौटाएंगे। जब आप पहले से ही सर्वलेट 3.0 (Glassfish 3, Tomcat 7, आदि) पर हैं, तो आप इसके बजाय HttpServletRequest#getParts() का उपयोग कर सकते हैं। विस्तारित उदाहरणों के लिए this blog भी देखें।

सर्वलेट 3.0 से पहले, de factomultipart/form-data अनुरोधों के लिए मानक Apache Commons FileUpload का उपयोग करेगा। बस इसका उपयोग कैसे करें इसका उपयोग करने के लिए उपयोगकर्ता मार्गदर्शिका और अक्सर पूछे जाने वाले प्रश्न अनुभागों को ध्यान से पढ़ें। मैंने here से पहले एक कोड उदाहरण के साथ एक उत्तर पोस्ट किया है (इसमें एक उदाहरण लक्ष्यीकरण 3.0 शामिल है)।

+1

सावधान रहें। अपाचे साइट पर कुछ दस्तावेज गलत हैं। उदाहरण के लिए वे कहते हैं कि आप FileItemFactory ऑब्जेक्ट पर setRepository() को कॉल कर सकते हैं जो गलत है क्योंकि FileItemFactory को लागू करने वाली कोई भी वस्तु केवल एक विधि है: createItem()। तो सुनिश्चित करें कि आप javadocs भी पढ़ते हैं। – Cheruvim

+1

'getParts()' हमेशा शून्य आइटम लौटाता है। जावा और सर्वलेट 3.0 में मल्टीपार्ट फॉर्म पुनर्प्राप्त करना इतना कठिन क्यों है? विश्वास नहीं कर सकता! – basZero

+0

@basZero: डुप्लिकेट प्रश्न का उत्तर पहले से ही बताएगा कि यह खाली होगा। – BalusC

16

समाधान:

समाधान एक:

  1. डाउनलोड http://www.servlets.com/cos/index.html
  2. आह्वान getParameters() पर com.oreilly.servlet.MultipartRequest

समाधान बी: ​​

  1. नीचे लोड http://jakarta.Apache.org/commons/fileupload/
  2. आह्वान readHeaders() org.apache.commons.fileupload.MultipartStream

समाधान सी में:

  1. डाउनलोड http://users.boone.net/wbrameld/multipartformdata/
  2. आह्वान पर getParameter com.bigfoot.bugar.servlet.http.MultipartFormData

समाधान डी:

स्ट्रेट्स का उपयोग करें। स्ट्रैट्स 1.1 स्वचालित रूप से इसे संभालता है।

संदर्भ: http://www.jguru.com/faq/view.jsp?EID=1045507

+4

कृपया कुछ समाधान दें क्योंकि भविष्य में यह लिंक किसी भी समय अप्रचलित हो सकते हैं। यह नकारात्मक रेटिंग आकर्षित करेगा। –

2

नहीं हमेशा वहाँ किसी अपलोड का पहले एक सर्वलेट है (मैं उदाहरण के लिए एक फिल्टर इस्तेमाल कर सकते हैं)। या हो सकता है कि एक ही नियंत्रक (फिर एक फ़िल्टर या एक servelt) कई कार्यों की सेवा कर सकता है, तो मुझे लगता है कि GetPart विधि (केवल Servlet API> = 3.0 के लिए) का उपयोग करने के लिए उस सर्वलेट कॉन्फ़िगरेशन पर भरोसा है, मैं नहीं करता पता है, मुझे पसंद नहीं है।

सामान्य रूप से, मैं अकेले रहने में सक्षम स्वतंत्र समाधान पसंद करता हूं, और इस मामले में http://commons.apache.org/proper/commons-fileupload/ उसमें से एक है।

List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 
    for (FileItem item : multiparts) { 
     if (!item.isFormField()) { 
      //your operations on file 
     } else { 
      String name = item.getFieldName(); 
      String value = item.getString(); 
      //you operations on paramters 
     } 
}