কীভাবে কনফিগার করতে হবে এবং সমস্যা সমাধানের বিষয়টি <p:fileUpload>
নির্ভর করে প্রাইমফিজ সংস্করণে।
সমস্ত প্রাইমফ্রিজ সংস্করণ
নীচের প্রয়োজনীয়তাগুলি সমস্ত প্রাইমফ্রিজ সংস্করণগুলিতে প্রযোজ্য:
enctype
এর অ্যাট্রিবিউট <h:form>
চাহিদা সেট হওয়ার multipart/form-data
। যখন এটি অনুপস্থিত থাকে, এজাক্স আপলোডটি কেবল কাজ করতে পারে তবে সাধারণ ব্রাউজারের আচরণটি অনির্ধারিত এবং ফর্ম রচনা এবং ওয়েব ব্রাউজার মেক / সংস্করণে নির্ভর করে। এটি সর্বদা নিরাপদ দিকে থাকতে নির্দিষ্ট করুন।
যখন ব্যবহার mode="advanced"
(অর্থাত Ajax আপলোড, এই ডিফল্ট), তারপর নিশ্চিত করুন যে আপনি একটি করেছি <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 অনুরোধে অনুপলব্ধ। পরবর্তী অনুরোধে এটি পড়ার যে কোনও প্রয়াস সম্ভবত java.io.FileNotFoundException
অস্থায়ী ফাইলের সাথে শেষ হবে ।
প্রাইমফিস্কস 8.x
কনফিগারেশনটি নীচের 5.x সংস্করণ তথ্যের অনুরূপ, তবে আপনার শ্রোতা যদি না ডাকা হয় তবে অনুগ্রহ করে ফোন করা হয়েছে কিনা listener
এবং তা পরীক্ষা করুন (পূর্ব 8.x সংস্করণের মত)fileUploadListener
প্রাইমফ্রিজস 5.x
আপনি যদি জেএসএফ ২.২ ব্যবহার করেন এবং আপনার faces-config.xml
জেএসএফ ২.২ সংস্করণ অনুসারে ঘোষণা করা হয় তবে এটির জন্য কোনও অতিরিক্ত কনফিগারেশন প্রয়োজন হয় না । আপনার প্রাইমফ্রিজ ফাইল আপলোড ফিল্টার মোটেই দরকার নেই। যদি আপনার পক্ষে অস্পষ্ট না হয় যেভাবে ব্যবহৃত টার্গেট সার্ভারটি নির্ভর করে জেএসএফকে কীভাবে সঠিকভাবে ইনস্টল এবং কনফিগার করতে হয়, মাভেনের মাধ্যমে জেএসএফ লাইব্রেরিগুলি কীভাবে সঠিকভাবে ইনস্টল করতে ও কনফিগার করতে হয় তার দিকে যান? এবং আমাদের জেএসএফ উইকি পৃষ্ঠার "জেএসএফ ইনস্টল করা" বিভাগ ।
তবে আপনি যদি এখনও জেএসএফ ২.২ ব্যবহার করছেন না এবং আপনি এটি আপগ্রেড করতে পারবেন না (সার্ভলেট Serv.০ সামঞ্জস্যপূর্ণ ধারকটিতে ইতিমধ্যে অনায়াস হওয়া উচিত) তবে আপনাকে নীচে প্রাইমফিজ ফাইল ফাইল আপলোড ফিল্টারটি ম্যানুয়ালি নিবন্ধিত 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
অ্যাপাচি কমন্স ফাইলআপলোডের পরিবর্তে নেটিভ এপিআই ব্যবহৃত হলে এটি ফিরে আসবে। UploadedFile#getInputStream()
পরিবর্তে আপনার ব্যবহার করা উচিত। আরও দেখুন কীভাবে পি: ফাইল থেকে আপলোড করা ছবিটি মাইএসকিউএল-এ বিএলএলবি হিসাবে আপলোড করবেন?
নেটিভ এপিআই সহ আরেকটি সম্ভাব্য সমস্যা প্রকাশিত হবে যখন আপলোড উপাদানটি এমন ফর্মটিতে উপস্থিত থাকে যার উপর একটি পৃথক "নিয়মিত" এজ্যাক্স অনুরোধ বরখাস্ত করা হয় যা আপলোড উপাদানটি প্রক্রিয়া করে না। আরও দেখুন ফাইল আপলোড প্রাইমফাইজস 4.0 / জেএসএফ 2.2.x - এজেএক্সের সাথে কাজ করে না - javax.servlet.SerletException: অনুরোধের সামগ্রী-ধরণটি কোনও মাল্টিপার্ট / ফর্ম-ডেটা নয় ।
অ্যাপাচি কমন্স ফাইলআপলোডে স্যুইচ করে উভয় সমস্যার সমাধান করা যেতে পারে। বিস্তারিত জানতে প্রাইমফ্রিজস 3.x বিভাগটি দেখুন।
প্রাইমফ্রিজস 3.x
এই সংস্করণটি জেএসএফ ২.২ / সার্লেট ৩.০ নেটিভ ফাইল আপলোড সমর্থন করে না। আপনাকে ম্যানুয়ালি অ্যাপাচি কমন্স ফাইলআপলোড ইনস্টল করতে হবে এবং স্পষ্টভাবে ফাইল আপলোড ফিল্টারটি নিবন্ধিত করতে হবে web.xml
।
আপনার নিম্নলিখিত গ্রন্থাগারগুলি প্রয়োজন:
তাদের অবশ্যই ওয়েব অ্যাপের রানটাইম ক্লাসপথে উপস্থিত থাকতে হবে। মাভেন ব্যবহার করার সময়, তারা কমপক্ষে রানটাইম স্কোপড রয়েছে তা নিশ্চিত করুন (সংকলনের ডিফল্ট স্কোপটিও ভাল)। জ্যানগুলি যখন ম্যানুয়ালি বহন করে চলেছে তখন নিশ্চিত হয়ে নিন যে সেগুলি /WEB-INF/lib
ফোল্ডারে শেষ হয়েছে ।
ফাইল আপলোড ফিল্টার রেজিস্ট্রেশন বিশদটি এখানে উপরের প্রাইমফিসি 5.x বিভাগে পাওয়া যাবে। যদি আপনি প্রাইমফ্রিজস 4+ ব্যবহার করেন এবং আপনি জেএসএফ ২.২ / সার্লেট ৩.০ নেটিভ ফাইল আপলোডের পরিবর্তে স্পষ্টতই অ্যাপাচি কমন্স ফাইল আপলোড ব্যবহার করতে চান তবে আপনাকে উল্লিখিত লাইব্রেরির পাশে প্রয়োজন এবং নীচের প্রসঙ্গের প্যারামেও ফিল্টার করতে পারেন 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
আপনার ওয়েব অ্যাপ্লিকেশনটি যা রান করার আগে PrimeFaces ফাইল আপলোড ফিল্টার এবং ইতিমধ্যে যেমন ডাকে অনুরোধের মূল ধ্বংস করেছে getParameter()
, getParameterMap()
, getReader()
, ইত্যাদি। একটি অনুরোধের বডিটি কেবল একবার পার্স করা যায়। আপনি যখন ফাইল আপলোড ফিল্টারটি কাজ করার আগে এই পদ্ধতিগুলির মধ্যে একটি কল করেন, তখন ফাইল আপলোড ফিল্টার একটি খালি অনুরোধের বডি পাবে।
এটি ঠিক করতে, আপনাকে অন্য ফিল্টারটি <filter-mapping>
প্রবেশের আগে ফাইল আপলোড ফিল্টারটি লাগাতে হবে web.xml
। যদি অনুরোধটি কোনও multipart/form-data
অনুরোধ না হয় তবে ফাইল আপলোড ফিল্টারটি ঠিক এমনভাবে চলতে থাকবে যেন কিছুই ঘটেনি। আপনি যদি স্বয়ংক্রিয়ভাবে যুক্ত ফিল্টারগুলি ব্যবহার করেন যেহেতু তারা টীকাগুলি ব্যবহার করে (যেমন: প্রেটিফোর্ডস), আপনাকে ওয়েব.এক্সএমএল এর মাধ্যমে সুস্পষ্ট ক্রম যুক্ত করতে হবে। WAR এ টীকাগুলি ব্যবহার করে কীভাবে কার্যনির্বাহনের servlet ফিল্টার ক্রম সংজ্ঞা দেওয়া যায় তা দেখুন
আপনি যদি কেবল প্রাইমফিজ ফাইল ফাইল আপলোড ফিল্টার ব্যবহার করেন তবে: আপনার ওয়েব অ্যাপে আরও একটি Filter
আছে যা প্রাইমফ্রিজ ফাইল আপলোড ফিল্টারের আগে চলে এবং একটি RequestDispatcher#forward()
কল সম্পাদন করেছে । সাধারণত, ইউআরএল পুনর্লিখন ফিল্টারগুলি যেমন প্রাকটিফিসগুলি এটি করে। এই ট্রিগার 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>
। এটি এইচটিএমএলে অবৈধ এবং ব্রাউজারের আচরণ নির্ধারিত। প্রায়শই বেশি, ব্রাউজার জমা দেওয়ার সময় প্রত্যাশিত ডেটা প্রেরণ করবে না। আপনি বাসা বাঁধছেন না তা নিশ্চিত করুন <h:form>
। এটি সম্পূর্ণরূপে ফর্ম এর নির্বিশেষে enctype
। কিছুতেই বাসা বাঁধে না।
আপনার যদি এখনও সমস্যা হয় তবে ভাল, HTTP ট্র্যাফিক ডিবাগ করুন। ওয়েব ব্রাউজারের বিকাশকারী সরঞ্জামসেটটি খুলুন (ক্রোম / ফায়ারব্যাগ 23 + / আই 9 + এফ 12 টিপুন) এবং নেট / নেটওয়ার্ক বিভাগটি পরীক্ষা করুন। যদি এইচটিটিপি অংশটি দেখতে ভাল লাগে তবে জেএসএফ কোডটি ডিবাগ করুন। একটি ব্রেকপয়েন্ট রাখুন FileUploadRenderer#decode()
এবং সেখান থেকে অগ্রসর হন।
আপলোড করা ফাইল সংরক্ষণ করা হচ্ছে
আপনি অবশেষে এটি কাজ করার পরে, আপনার পরবর্তী প্রশ্ন সম্ভবত "আপলোড করা ফাইলটি কীভাবে / কোথায় সংরক্ষণ করব?" এর মতো হতে পারে। ভাল, এখানে চালিয়ে যান: জেএসএফ-এ আপলোড করা ফাইলটি কীভাবে সংরক্ষণ করবেন ।
web.xml
প্রাইমফ্রিজ ব্যবহারকারী গাইড অনুসারে প্রাইমফ্রিজ আপলোড ফিল্টারটি নিবন্ধন করেন নি । আপনি কি এটা পড়েছেন? এটি তবে কেন আপনার পক্ষেmode="simple"
কাজ করে তা ব্যাখ্যা করবে না ।