मैंने कुछ सुझाव देखे हैं जैसे छवि निर्देशिका वेब कंटेनर के बाहर एक निर्देशिका की ओर इशारा करते हुए एक प्रतीकात्मक लिंक होने के नाते, लेकिन क्या यह दृष्टिकोण विंडोज और * निक्स के वातावरण दोनों पर काम करेगा?
यदि आप * निक्स फाइलसिस्टम पथ नियमों का पालन करते हैं (यानी आप विशेष रूप से फॉरवर्ड स्लैश का उपयोग करते हैं /path/to/files), तो यह विंडोज पर काम करेगा और साथ ही साथ बदसूरत File.separatorस्ट्रिंग-संघनन के साथ चारों ओर फेल होने की आवश्यकता के बिना । हालाँकि यह केवल उसी कार्यशील डिस्क पर स्कैन किया जाएगा जहाँ से इस कमांड को लागू किया गया है। तो यदि टॉमकैट उदाहरण के लिए स्थापित है, C:तो /path/to/filesवास्तव में इंगित करेगा C:\path\to\files।
यदि फ़ाइलें वेबएप के बाहर स्थित हैं, और आप DefaultServletउन्हें संभालने के लिए टॉमकैट रखना चाहते हैं, तो आपको मूल रूप से टॉमकैट में करने की आवश्यकता है, निम्नलिखित कॉन्सेप्ट तत्व को /conf/server.xmlअंदर <Host>टैग में जोड़ना है :
<Context docBase="/path/to/files" path="/files" />
इस तरह से वे सुलभ होंगे http://example.com/files/...। GlassFish / Payara विन्यास उदाहरण यहाँ पाया जा सकता है और WildFly विन्यास उदाहरण यहाँ पाया जा सकता है ।
आप पढ़ / लिख फ़ाइलें अपने आप पर नियंत्रण करना चाहते हैं, तो आप एक बनाने की जरूरत Servletइस जो मूल रूप से सिर्फ एक हो जाता है के लिए InputStreamउदाहरण के लिए के स्वाद में फ़ाइल की FileInputStreamऔर इसे करने के लिए लिखते हैं OutputStreamकी HttpServletResponse।
प्रतिक्रिया पर, आपको Content-Typeहेडर सेट करना चाहिए ताकि क्लाइंट को पता हो कि कौन सी एप्लिकेशन को प्रदान की गई फ़ाइल के साथ जुड़ना है। और, आपको Content-Lengthहेडर सेट करना चाहिए ताकि क्लाइंट डाउनलोड प्रगति की गणना कर सके, अन्यथा यह अज्ञात होगा। और, आपको Content-Dispositionशीर्षलेख सेट करना चाहिए, attachmentयदि आप एक सेव अस डायलॉग चाहते हैं , अन्यथा क्लाइंट इसे इनलाइन प्रदर्शित करने का प्रयास करेगा। अंत में सिर्फ फाइल कंटेंट को रिस्पॉन्स आउटपुट स्ट्रीम पर लिखें।
यहाँ इस तरह के सर्वलेट का मूल उदाहरण दिया गया है:
@WebServlet("/files/*")
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String filename = URLDecoder.decode(request.getPathInfo().substring(1), "UTF-8");
File file = new File("/path/to/files", filename);
response.setHeader("Content-Type", getServletContext().getMimeType(filename));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
Files.copy(file.toPath(), response.getOutputStream());
}
}
जब url-patternउदाहरण के लिए मैप किया जाता है /files/*, तो आप इसे कॉल कर सकते हैं http://example.com/files/image.png। इस तरह से आपके पास अनुरोधों की तुलना में अधिक नियंत्रण हो सकता DefaultServletहै, जैसे कि डिफ़ॉल्ट छवि (यानी if (!file.exists()) file = new File("/path/to/files", "404.gif")या तो) प्रदान करना। इसके अलावा request.getPathInfo()ऊपर का उपयोग करना पसंद किया जाता है request.getParameter()क्योंकि यह अधिक एसईओ के अनुकूल है और अन्यथा IE सेव अस के दौरान सही फ़ाइल नाम नहीं उठाएगा ।
आप डेटाबेस से फ़ाइलों की सेवा के लिए एक ही तर्क का पुन: उपयोग कर सकते हैं। बस new FileInputStream()द्वारा प्रतिस्थापित करें ResultSet#getInputStream()।
उम्मीद है की यह मदद करेगा।
यह सभी देखें: