कॉन्फ़िगर और समस्या निवारण कैसे करें यह <p:fileUpload>
प्राइमफेस संस्करण पर निर्भर करता है।
सभी प्राइमफेस संस्करण
नीचे की आवश्यकताएँ सभी प्राइमफेस संस्करणों पर लागू होती हैं:
सेट की जाने वाली जरूरतों का enctype
गुण । जब यह अनुपस्थित है, ajax अपलोड सिर्फ काम कर सकता है, लेकिन सामान्य ब्राउज़र व्यवहार अनिर्दिष्ट है और प्रपत्र संरचना और वेबब्रोसर मेक / संस्करण पर निर्भर है। बस हमेशा इसे सुरक्षित पक्ष पर निर्दिष्ट करें।<h:form>
multipart/form-data
उपयोग करते समय mode="advanced"
(यानी अजाक्स अपलोड, यह डिफ़ॉल्ट है), फिर सुनिश्चित करें कि आप एक <h:head>
(मास्टर) टेम्पलेट में हैं। यह सुनिश्चित करेगा कि आवश्यक जावास्क्रिप्ट फाइलें ठीक से शामिल हैं। इसके लिए mode="simple"
(गैर-अजाक्स अपलोड) की आवश्यकता नहीं है , लेकिन यह अन्य सभी प्राइमफेस घटकों के लुक-ऑन'फिल और कार्यक्षमता को तोड़ देगा, इसलिए आप वैसे भी याद नहीं करना चाहते हैं।
का उपयोग करते समय mode="simple"
(यानी गैर ajax अपलोड), तो ajax पर किसी भी PrimeFaces आदेश बटन / द्वारा लिंक अक्षम होने चाहिए ajax="false"
, और आप का उपयोग करना चाहिए <p:fileUpload value>
के साथ <p:commandButton action>
के बजाय <p:fileUpload fileUploadListener>
(PrimeFaces के लिए <= 7.x) या <p:fileUpload listener>
(PrimeFaces के लिए> = 8.x)
तो, यदि आप (ऑटो) फ़ाइल को अजाक्स समर्थन (मन <h:head>
!) के साथ अपलोड करना चाहते हैं :
<h:form enctype="multipart/form-data">
<p:fileUpload fileUploadListener="#{bean.upload}" auto="true" /> // for PrimeFaces >= 8.x this should be listener instead of fileUploadListener
</h:form>
public void upload(FileUploadEvent event) {
UploadedFile uploadedFile = event.getFile();
String fileName = uploadedFile.getFileName();
String contentType = uploadedFile.getContentType();
byte[] contents = uploadedFile.getContents(); // Or getInputStream()
// ... Save it, now!
}
या यदि आप गैर-अजाक्स फ़ाइल अपलोड करना चाहते हैं:
<h:form enctype="multipart/form-data">
<p:fileUpload mode="simple" value="#{bean.uploadedFile}" />
<p:commandButton value="Upload" action="#{bean.upload}" ajax="false" />
</h:form>
private UploadedFile uploadedFile; // +getter+setter
public void upload() {
String fileName = uploadedFile.getFileName();
String contentType = uploadedFile.getContentType();
byte[] contents = uploadedFile.getContents(); // Or getInputStream()
// ... Save it, now!
}
ध्यान दें कि इस तरह के रूप ajax से संबंधित गुण है auto
, allowTypes
, update
, onstart
, oncomplete
, आदि कर रहे हैं पर ध्यान नहीं दिया में mode="simple"
। इसलिए उन्हें ऐसे मामले में निर्दिष्ट करना अनावश्यक है।
यह भी ध्यान दें कि आपको उपर्युक्त विधियों के अंदर फ़ाइल सामग्री को तुरंत पढ़ना चाहिए और बाद में HTTP अनुरोध द्वारा लागू अलग बीन विधि में नहीं। ऐसा इसलिए है क्योंकि अपलोड की गई फ़ाइल सामग्री अनुरोधित है और बाद में / अलग HTTP अनुरोध में अनुपलब्ध है। बाद के अनुरोध में इसे पढ़ने का कोई भी प्रयास java.io.FileNotFoundException
अस्थायी फ़ाइल के साथ समाप्त हो जाएगा ।
प्रधानमंत्री 8.x
कॉन्फ़िगरेशन नीचे दिए गए 5.x संस्करण जानकारी के समान है, लेकिन अगर आपके श्रोता को नहीं बुलाया जाता है, तो जांचें कि क्या एट्रीब्यूट कहा जाता है listener
और नहीं (पूर्व 8.x संस्करणों की तरह)fileUploadListener
प्रधानमंत्री 5.x
यदि आप JSF 2.2 का उपयोग कर रहे हैं और इसके लिए आपको faces-config.xml
JSF 2.2 संस्करण के अनुरूप भी घोषित किया गया है, तो किसी भी अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है । आपको प्राइमफेस फ़ाइल अपलोड फ़िल्टर की बिल्कुल भी आवश्यकता नहीं है। मामले में यह आपके लिए स्पष्ट नहीं है कि उपयोग किए गए लक्ष्य सर्वर के आधार पर जेएसएफ को ठीक से कैसे स्थापित करें और कॉन्फ़िगर करें, मावेन के माध्यम से जेएसएफ लाइब्रेरी को ठीक से कैसे स्थापित करें और कॉन्फ़िगर करें? और हमारे जेएसएफ विकी पेज का "इंस्टालेशन जेएसएफ" सेक्शन ।
यदि आप हालांकि अभी तक JSF 2.2 का उपयोग नहीं कर रहे हैं और आप इसे अपग्रेड नहीं कर सकते हैं (पहले से ही सर्वलेट 3.0 संगत कंटेनर पर होने पर यह सरल होना चाहिए), तो आपको मैन्युअल रूप से नीचे दिए गए प्राइमफेस फ़ाइल अपलोड फ़िल्टर को पंजीकृत करने की आवश्यकता है web.xml
(यह मल्टी पार्स करेगा भाग अनुरोध और नियमित अनुरोध पैरामीटर मानचित्र भरें ताकि FacesServlet
सामान्य रूप से काम करना जारी रह सके):
<filter>
<filter-name>primeFacesFileUploadFilter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>primeFacesFileUploadFilter</filter-name>
<servlet-name>facesServlet</servlet-name>
</filter-mapping>
<servlet-name>
के मान facesServlet
में वास्तव में मूल्य से मेल खाना चाहिए <servlet>
के प्रवेश javax.faces.webapp.FacesServlet
ही में web.xml
। इसलिए यदि यह उदाहरण है Faces Servlet
, तो आपको मिलान के अनुसार इसे संपादित करने की आवश्यकता है।
प्रधानमंत्री 4.x
प्राइमफेस 5.x जैसी ही कहानी 4.x पर भी लागू होती है।
द्वारा अपलोड की गई फ़ाइल सामग्री प्राप्त करने में केवल एक संभावित समस्या है UploadedFile#getContents()
। यह null
तब वापस आएगा जब Apache Commons FileUpload के बजाय देशी एपीआई का उपयोग किया जाएगा। आपको UploadedFile#getInputStream()
इसके बजाय उपयोग करने की आवश्यकता है । यह भी देखें कि पी से अपलोड की गई छवि कैसे डालें: MySQL में BLOB के रूप में fileUpload?
देशी एपीआई के साथ एक और संभावित समस्या तब प्रकट होगी जब अपलोड घटक एक ऐसे रूप में मौजूद होगा जिस पर एक अलग "नियमित" अजाक्स अनुरोध निकाल दिया जाता है जो अपलोड घटक को संसाधित नहीं करता है। यह भी देखें कि फ़ाइल अपलोड प्राइमफेस 4.0 / JSF 2.2.x - javax.servlet.ServletException में AJAX के साथ काम नहीं करता है: अनुरोध सामग्री-प्रकार एक मल्टीपार्ट / फॉर्म-डेटा नहीं है ।
दोनों ही समस्याओं को Apache Commons FileUpload पर स्विच करके भी हल किया जा सकता है। विस्तार के लिए PrimeFaces 3.x अनुभाग देखें।
प्रधानमंत्री 3.x
यह संस्करण JSF 2.2 / सर्वलेट 3.0 मूल फ़ाइल अपलोड का समर्थन नहीं करता है। आपको Apache Commons FileUpload को मैन्युअल रूप से इंस्टॉल करना होगा और फ़ाइल अपलोड फ़िल्टर को स्पष्ट रूप से पंजीकृत करना होगा web.xml
।
आपको निम्न पुस्तकालयों की आवश्यकता है:
जिन्हें वेबएप के रनटाइम क्लासपाथ में मौजूद होना चाहिए। मावेन का उपयोग करते समय, सुनिश्चित करें कि वे कम से कम रनटाइम स्कॉप्ड हैं (संकलन का डिफ़ॉल्ट दायरा भी अच्छा है)। जब मैन्युअल रूप से JARs के चारों ओर ले जाते हैं, तो सुनिश्चित करें कि वे /WEB-INF/lib
फ़ोल्डर में समाप्त होते हैं ।
फ़ाइल अपलोड फ़िल्टर पंजीकरण विवरण यहां दिए गए प्राइमफेस 5.x अनुभाग में पाया जा सकता है। यदि आप प्राइमफेस 4+ का उपयोग कर रहे हैं और आप स्पष्ट रूप से JSF 2.2 / सर्वलेट 3.0 देशी फ़ाइल अपलोड के बजाय Apache Commons FileUpload का उपयोग करना चाहते हैं, तो आपको उल्लिखित पुस्तकालयों के आगे की आवश्यकता है और नीचे दिए गए संदर्भ पैरम को भी फ़िल्टर करें web.xml
:
<context-param>
<param-name>primefaces.UPLOADER</param-name>
<param-value>commons</param-value><!-- Allowed values: auto, native and commons. -->
</context-param>
समस्या निवारण
यदि यह अभी भी काम नहीं करता है, तो यहां प्राइमफेस कॉन्फ़िगरेशन के असंबंधित अन्य संभावित कारण हैं:
सिर्फ अगर आप PrimeFaces फाइल अपलोड फिल्टर का उपयोग कर रहे हैं: एक और है Filter
अपने webapp में जो चलाता है से पहले PrimeFaces फाइल अपलोड फिल्टर और पहले से ही जैसे बुला द्वारा अनुरोध शरीर का सेवन किया है getParameter()
, getParameterMap()
, getReader()
, आदि। एक अनुरोध निकाय को केवल एक बार पार्स किया जा सकता है। जब आप फ़ाइल अपलोड फ़िल्टर अपना काम करने से पहले उन तरीकों में से एक को कॉल करते हैं, तो फ़ाइल अपलोड फ़िल्टर को एक खाली अनुरोध निकाय मिलेगा।
इसे ठीक करने के लिए, आपको <filter-mapping>
फ़ाइल फ़िल्टर फ़िल्टर को अन्य फ़िल्टर से पहले डालना होगा web.xml
। यदि अनुरोध अनुरोध नहीं है multipart/form-data
, तो फ़ाइल अपलोड फ़िल्टर बस जारी रहेगा जैसे कि कुछ भी नहीं हुआ। यदि आप ऐसे फ़िल्टर का उपयोग करते हैं जो स्वचालित रूप से जोड़े जाते हैं, क्योंकि वे एनोटेशन (जैसे कि सुंदर जगह) का उपयोग करते हैं, तो आपको web.xml के माध्यम से स्पष्ट आदेश जोड़ने की आवश्यकता हो सकती है। WAR में एनोटेशन का उपयोग करके निष्पादन के सर्वलेट फ़िल्टर ऑर्डर को कैसे परिभाषित करें देखें
यदि आप प्राइमफेस फाइल अपलोड फिल्टर का उपयोग कर रहे हैं, केवल तभी: आपके वेबऐप Filter
में एक और है जो प्राइमफेस फाइल अपलोड फिल्टर से पहले चलता है और एक RequestDispatcher#forward()
कॉल किया है । आमतौर पर, URL फिर से फ़िल्टर करते हैं जैसे कि PrettyFaces ऐसा करते हैं। यह FORWARD
डिस्पैचर को ट्रिगर करता है , लेकिन फ़िल्टर REQUEST
डिस्पैचर पर डिफ़ॉल्ट रूप से सुनता है ।
इसे ठीक करने के लिए, आपको फ़ॉरवर्डिंग फ़िल्टर से पहले प्राइमफेस फ़ाइल अपलोड फ़िल्टर डालना होगा , या FORWARD
डिस्पैचर पर भी सुनने के लिए प्राइमफेस फ़ाइल अपलोड फ़िल्टर को फिर से कॉन्फ़िगर करना होगा :
<filter-mapping>
<filter-name>primeFacesFileUploadFilter</filter-name>
<servlet-name>facesServlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
एक नेस्टेड है <h:form>
। यह HTML में अवैध है और ब्राउज़र व्यवहार अनिर्दिष्ट है। अधिक बार, ब्राउज़र सबमिट पर अपेक्षित डेटा नहीं भेजेगा। सुनिश्चित करें कि आप घोंसले के शिकार नहीं हैं <h:form>
। यह पूरी तरह से फॉर्म की परवाह किए बिना है enctype
। बस घोंसले नहीं बनाते हैं।
यदि आपको अभी भी समस्या हो रही है, तो HTTP ट्रैफ़िक को डीबग करें। Webbrowser के डेवलपर टूलसेट को खोलें (Chrome / Firebug23 + / IE9 + में F12 दबाएं) और नेट / नेटवर्क अनुभाग जांचें। यदि HTTP भाग ठीक दिखता है, तो JSF कोड डीबग करें। एक ब्रेकपॉइंट लगाएं FileUploadRenderer#decode()
और वहां से आगे बढ़ें ।
अपलोड की गई फ़ाइल सहेज रहा है
आखिरकार आपको यह काम करने के लिए मिला, आपका अगला सवाल शायद "कैसे / कहां मैं अपलोड की गई फ़ाइल को बचाऊं?" जैसा होगा। खैर, यहां जारी रखें: जेएसएफ में अपलोड की गई फ़ाइल को कैसे बचाया जाए ।
web.xml
प्राइमफेसर्स यूजर गाइड के अनुसार प्राइमफेस अपलोड फिल्टर को रजिस्टर नहीं किया है । क्या आपने इसे वैसे भी पढ़ा? हालांकि यह स्पष्ट नहीं होगा किmode="simple"
आपके लिए काम क्यों करता है।