आईडीई के प्रोजेक्ट फोल्डर उर्फ सर्वर के फोल्डर के अलावा एक सुलभ स्थान पर कहीं भी स्टोर करें , अपलोड की गई छवि के उत्तर में उल्लिखित कारणों के लिए केवल पृष्ठ को ताज़ा करने के बाद उपलब्ध है :
आईडीई के प्रोजेक्ट फ़ोल्डर में परिवर्तन तुरंत सर्वर के कार्य फ़ोल्डर में परिलक्षित नहीं होता है। IDE में एक तरह का बैकग्राउंड जॉब होता है जो इस बात का ध्यान रखता है कि सर्वर का वर्क फोल्डर अंतिम अपडेट के साथ सिंक हो जाए (यह IDE शब्दों में "प्रकाशन" कहलाता है)। यह आपके द्वारा देखी जा रही समस्या का मुख्य कारण है।
वास्तविक विश्व कोड में ऐसी परिस्थितियां होती हैं जहां वेबैप के फ़ोल्डर में अपलोड की गई फ़ाइलों को संग्रहीत करना बिल्कुल भी काम नहीं करेगा। कुछ सर्वर (या तो डिफ़ॉल्ट रूप से या कॉन्फ़िगरेशन द्वारा) तैनात WAR फ़ाइल को स्थानीय डिस्क फ़ाइल सिस्टम में विस्तारित नहीं करते हैं, लेकिन इसके बजाय पूरी तरह से मेमोरी में। आप मूल रूप से तैनात WAR फ़ाइल को एडिट किए बिना और इसे रीडेपॉल्ड करके मेमोरी में नई फाइलें नहीं बना सकते।
यहां तक कि जब सर्वर तैनात WAR फ़ाइल को स्थानीय डिस्क फ़ाइल सिस्टम में विस्तारित करता है, तो सभी नई बनाई गई फ़ाइलें एक redeploy पर खो जाएगी या यहां तक कि एक सरल पुनरारंभ, बस इसलिए कि उन नई फाइलें मूल WAR फ़ाइल का हिस्सा नहीं हैं।
यह वास्तव में मेरे या किसी और के लिए मायने नहीं रखता है, जहां स्थानीय डिस्क फ़ाइल सिस्टम पर यह सहेजा जाएगा, जब तक आप कभी भी विधि का उपयोग नहीं करते हैंgetRealPath()
। उस विधि का उपयोग करना किसी भी मामले में खतरनाक है।
भंडारण स्थान का मार्ग बदले में कई तरीकों से निश्चित किया जा सकता है। आपको यह सब अपने आप से करना होगा । शायद यह वह जगह है जहां आपका भ्रम पैदा होता है क्योंकि आप किसी तरह उम्मीद करते हैं कि सर्वर स्वचालित रूप से सभी करता है। कृपया ध्यान दें कि अंतिम अपलोड गंतव्य निर्दिष्ट नहीं@MultipartConfig(location)
करता है, लेकिन केस फ़ाइल आकार के लिए अस्थायी भंडारण स्थान मेमोरी स्टोरेज सीमा से अधिक है।
तो, अंतिम संग्रहण स्थान का रास्ता निम्नलिखित में से किसी एक तरीके से निश्चित किया जा सकता है:
हार्ड कोडित:
File uploads = new File("/path/to/uploads");
के माध्यम से पर्यावरण चर SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
के माध्यम से सर्वर स्टार्टअप के दौरान वीएम तर्क -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
फ़ाइल प्रविष्टि इस प्रकार है upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
नाम upload.location
और मूल्य के साथ /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
यदि कोई हो, तो सर्वर प्रदान किए गए स्थान का उपयोग करें, जैसे JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
किसी भी तरह, आप आसानी से संदर्भ और फ़ाइल को निम्नानुसार सहेज सकते हैं:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
या, जब आप उपयोगकर्ताओं को संयोग से एक ही नाम के साथ मौजूदा फ़ाइलों को अधिलेखित करने से रोकने के लिए एक अद्वितीय फ़ाइल नाम को स्वचालित करना चाहते हैं:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
part
जेएसपी / सर्वलेट में कैसे प्राप्त किया जाता है, इसका उत्तर जेएसपी / सर्वलेट का उपयोग करके सर्वर पर फाइलें कैसे अपलोड करें? और part
जेएसएफ में कैसे प्राप्त किया जाता है इसका जवाब जेएसएफ 2.2 <h: inputFile> का उपयोग करके फ़ाइल को कैसे अपलोड किया जाए? सहेजी गई फ़ाइल कहाँ है?
नोट: इसका उपयोग न करें Part#write()
क्योंकि यह परिभाषित अस्थायी भंडारण स्थान के सापेक्ष पथ की व्याख्या करता है @MultipartConfig(location)
।
यह सभी देखें: