2012-02-07 13 views
5

मुझे पता है कि प्राइमफ़ेस का उपयोग करके फ़ाइल अपलोड कैसे करें या टॉमहॉक का उपयोग करके, मैं अपाचे कॉमन्स फ़ाइल अपलोड का उपयोग करके फ़ाइल अपलोड करने का प्रयास कर रहा हूं और अब तक मुझे सड़क का थोड़ा सा हिस्सा मिल रहा है ब्लॉक। भले ही मेरा फॉर्म multipart/form-data का उपयोग करता है, जब मैं अपना फॉर्म जमा करता हूं, तो सामग्री प्रकार application/x-www-form-urlencoded बन जाता है। यहाँ मेरी कोडअपाचे कॉमन्स फ़ाइल के साथ फ़ाइल अपलोड करने के लिए जेएसएफ कैसे प्राप्त करें

<h:body> 
    <h:form enctype="multipart/form-data"> 
     Upload File 
     <input type="file" name="file"/> 
     <p:commandButton value="Submit" action="#{viewBean.submit}"/> 
    </h:form> 
</h:body> 

यहाँ है मेरी ViewBean

@ManagedBean 
@ViewScoped 
public class ViewBean implements Serializable { 
    public void submit() { 
     String url = "/FileUploadServlet"; 
     FacesContext context = FacesContext.getCurrentInstance(); 
     try { 
      String contentType = context.getExternalContext().getRequestContentType(); 
      context.getExternalContext().dispatch(url); 
     } catch (Exception e) { 
      logger.log(Level.SEVERE, "Exception when calling Servlet", e); 
     } finally { 
      context.responseComplete(); 
     } 
    } 
} 

तो जब मैं सामग्री के ऊपर टाइप प्रिंट करने का प्रयास है, यह application/x-www-form-urlencoded से पता चला है। अगर मैं अपने p:commandButton को ajax="false" शब्दों में कहें, तो submit() विधि भी लागू नहीं किया गया है, लेकिन अगर मैं enctype="multipart/form-data" बाहर ले (अभी भी ajax="false" रखने), तो submit() शुरू हो जाती है, लेकिन यह मल्टीपार्ट नहीं है, यह application/x-www-form-urlencoded है, इसलिए Apache Commons fileupload एक अपवाद फेंक चूंकि यह मल्टीपार्ट नहीं है। ऐसा लगता है जो भी मैं करता हूं, मुझे लगता है कि मल्टीपार्ट आवश्यकता नहीं है। कृपया

उत्तर

12

तो जब मैं ऊपर सामग्री प्रकार मुद्रित करने का प्रयास करता हूं, तो यह एप्लिकेशन/एक्स-www-form-urlencoded दिखाता है।

<p:commandButton> डिफ़ॉल्ट रूप से भेजता स्तर 1 XMLHttpRequest का एक ajax अनुरोध। यह नहीं समर्थन multipart/form-data है। केवल level 2 XMLHttpRequest इसका समर्थन करता है, लेकिन यह केवल नवीनतम ब्राउज़रों (जो HTML5 का समर्थन भी करता है) में समर्थित है और जेएसएफ जेएस एपीआई में और न ही प्राइमफेस जेएस एपीआई में लागू किया गया है।


अगर मैं अपने पी ajax = "false" डाल: CommandButton, फिर सबमिट करें() विधि नहीं है यहां तक ​​कि लागू

लेकिन इस तरह से एक fullworthy multipart/form-dataहोगा भेजा गया। सबमिट सबमिट विधि लागू नहीं की गई है क्योंकि संस्करण 2.2 से पहले जेएसएफ multipart/form-data बॉक्स का अनुरोध करने का समर्थन नहीं करता है। जेएसएफ अंतर्निहित HTTP सर्वलेट अनुरोध पर request.getParameter() और getParameterMap() का उपयोग करके डिफ़ॉल्ट रूप से सबमिट किए गए डेटा को एकत्र करता है। हालांकि, यह लौटाएगा जब application/x-www-form-urlencoded के अलावा एक एन्कोडिंग का उपयोग किया गया है। चूंकि जेएसएफ सबमिट किए गए डेटा के आधार पर होने वाली कार्रवाई की विधि निर्धारित करता है, इसलिए यह डेटा null पर पता लगाने और उसे लागू करने में सक्षम नहीं होगा।

सिद्धांत रूप में, यदि आप एक Filter जो अपाचे कॉमन्स FileUpload या नए सर्वलेट 3.0 request.getPart()/getParts() तरीकों multipart/form-data अनुरोध से डेटा निकालने के लिए उपयोग करता है और जो getParameter() कॉल ओवरराइड करता है एक कस्टम कार्यान्वयन के साथ वर्तमान HTTP सर्वलेट अनुरोध लपेटता बनाने जिसमें निकाले गए डेटा की मैपिंग की आपूर्ति की जा रही है, तो जेएसएफ getParameter() कॉल के परिणामों के आधार पर आवश्यक नौकरी करने में सक्षम होगा। आप this article में सर्वलेट 3.0 एपीआई का उपयोग करने वाला एक ठोस उदाहरण पा सकते हैं और उसी उदाहरण को this answer में अपाचे कॉमन्स फ़ाइल अपलोड करने के लिए थोड़ा सा बदला गया है।

आगामी जेएसएफ 2.2 में एक नया <h:inputFile> घटक होगा जो एक सर्वलेट 3.0 Part संपत्ति के लिए बाध्यकारी होगा।

<h:form enctype="multipart/form-data"> 
    <h:inputFile value="#{bean.file}" /> 
    <h:commandButton value="submit" action="#{bean.submit}" /> 
</h:form> 

private Part file; 

JSF 2.2 अंतिम रिलीज के साथ

Q1 के देर से अंत के लिए निर्धारित है, लेकिन वर्तमान में एक स्नैपशॉट रिलीज के रूप में उपलब्ध है।

+0

बहुत बहुत धन्यवाद। यह सारी जानकारी जानना बहुत अच्छा है। –

+0

आपका स्वागत है। – BalusC

+0

@ बालससी मैंने ऐसा किया जैसा आपने कहा है 'फ़िल्टर' बनाने के लिए कहा है, लेकिन 'h: form' में' enctype = "multipart/form-data" है, तो कार्रवाई विधि फ़ायरिंग नहीं कर रही है। मैं जेएसएफ 1.2 में हूं। क्या आप कृपया मुझे बता सकते हैं कि यह क्यों हो रहा है? मैंने सवाल पूछा है [यहां] (http://stackoverflow.com/questions/14242293/hcommandbutton-is-not-firing-action-if-the-hform-has-enctype-multipart-form-d) –

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