JSP / सर्वलेट का उपयोग करके सर्वर पर फाइलें कैसे अपलोड करें?


688

मैं JSP / सर्वलेट का उपयोग करके सर्वर पर फाइलें कैसे अपलोड कर सकता हूं? मैंने यह कोशिश की:

<form action="upload" method="post">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

हालाँकि, मुझे केवल फ़ाइल नाम मिलता है, न कि फ़ाइल सामग्री। मैं जोड़ते हैं enctype="multipart/form-data"करने के लिए <form>है, तो request.getParameter()रिटर्न null

अनुसंधान के दौरान मैं अपाचे कॉमन फाइलअप लोड पर ठोकर खाई । मैंने यह कोशिश की:

FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); // This line is where it died.

दुर्भाग्य से, सर्वलेट ने स्पष्ट संदेश और कारण के बिना एक अपवाद फेंक दिया। यहाँ स्टैकट्रेस है:

SEVERE: Servlet.service() for servlet UploadServlet threw exception
javax.servlet.ServletException: Servlet execution threw an exception
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:637)

शायद यह लेख मददगार होगा: baeldung.com/upload-file-servlet
एडम जेरार्ड

जवाबों:


1193

परिचय

अपलोड करने के लिए फ़ाइल को ब्राउज़ करने और चुनने के लिए आपको <input type="file">प्रपत्र में एक HTML फ़ील्ड की आवश्यकता होती है । जैसा कि HTML विनिर्देश में कहा गया है कि आपको POSTविधि का उपयोग करना होगा और enctypeप्रपत्र की विशेषता को सेट करना होगा "multipart/form-data"

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

इस तरह के फॉर्म को जमा करने के बाद, बाइनरी मल्टीपार्ट फॉर्म डेटा अनुरोध निकाय में एक अलग प्रारूप में उपलब्ध होता है जब वह enctypeसेट नहीं होता है।

सर्वलेट 3.0 से पहले, सर्वलेट एपीआई ने मूल रूप से समर्थन नहीं किया multipart/form-data। यह केवल डिफ़ॉल्ट रूप का समर्थन करता है application/x-www-form-urlencodedrequest.getParameter()और पत्नी के सभी वापसी करेंगे nullजब बहुखण्डीय प्रपत्र डेटा का उपयोग कर। यह वह जगह है जहाँ प्रसिद्ध अपाचे कॉमन्स FileUpload तस्वीर में आया था।

इसे मैन्युअल रूप से पार्स न करें!

आप सिद्धांत रूप में अनुरोध निकाय को स्वयं के आधार पर पार्स कर सकते हैं ServletRequest#getInputStream()। हालांकि, यह एक सटीक और थकाऊ काम है जिसके लिए RFC2388 के सटीक ज्ञान की आवश्यकता होती है । आपको अपने स्वयं के या कुछ होमग्रोन लाइब्रेरी-कम-कोड को इंटरनेट पर कहीं और पाए जाने के लिए ऐसा करने का प्रयास नहीं करना चाहिए। बहुत से ऑनलाइन स्रोत इसमें असफल रहे हैं, जैसे कि roseindia.net। पीडीएफ फाइल को अपलोड करना भी देखें । आपको बरसों तक लाखों उपयोगकर्ताओं द्वारा उपयोग की जाने वाली एक वास्तविक लाइब्रेरी का उपयोग किया जाना चाहिए (और अंतर्निहित परीक्षण!)। इस तरह की लाइब्रेरी ने अपनी मजबूती साबित की है।

जब आप पहले से ही सर्वलेट 3.0 या नए पर हों, तो देशी एपीआई का उपयोग करें

यदि आप कम से कम सर्वलेट 3.0 (टॉमकैट 7, जेटी 9, जेबॉस 6, ग्लासफिश 3, आदि) का उपयोग कर रहे हैं, तो आप केवल मानक एपीआई का उपयोग HttpServletRequest#getPart()करके व्यक्तिगत मल्टीपार्ट फॉर्म डेटा आइटम (सबसे सर्वलेट 3.0 कार्यान्वयन) वास्तव में अपाचे का उपयोग कर सकते हैं। इसके लिए कवर के तहत कॉमन्स फाइलअपलोड!)। साथ ही, सामान्य फॉर्म फ़ील्ड getParameter()सामान्य तरीके से उपलब्ध हैं ।

पहले अपने सर्वलेट को एनोटेट करें @MultipartConfigताकि वह उसे पहचान सके और multipart/form-dataअनुरोधों का समर्थन कर सके और इस तरह getPart()काम कर सके:

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    // ...
}

फिर, doPost()इस प्रकार लागू करें :

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String description = request.getParameter("description"); // Retrieves <input type="text" name="description">
    Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
    InputStream fileContent = filePart.getInputStream();
    // ... (do your job here)
}

ध्यान दें Path#getFileName()। यह फ़ाइल नाम प्राप्त करने के लिए एक MSIE फिक्स है। यह ब्राउज़र गलत फ़ाइल नाम के बजाय केवल फ़ाइल नाम के साथ पूर्ण फ़ाइल पथ भेजता है।

यदि आपके पास <input type="file" name="file" multiple="true" />बहु-फ़ाइल अपलोड के लिए है, तो उन्हें नीचे के रूप में इकट्ठा करें (दुर्भाग्य से ऐसी कोई विधि नहीं है request.getParts("file")):

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
    List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName()) && part.getSize() > 0).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true">

    for (Part filePart : fileParts) {
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
        InputStream fileContent = filePart.getInputStream();
        // ... (do your job here)
    }
}

जब आप सर्वलेट 3.1 पर नहीं होते हैं, तो मैन्युअल रूप से सबमिट किया गया फ़ाइल नाम प्राप्त करें

ध्यान दें कि Part#getSubmittedFileName()सर्वलेट 3.1 (टॉमकैट 8, जेट्टी 9, वाइल्डली 8, ग्लासफिश 4, आदि) में पेश किया गया था। यदि आप अभी तक सर्वलेट 3.1 पर नहीं हैं, तो आपको प्रस्तुत फ़ाइल नाम प्राप्त करने के लिए एक अतिरिक्त उपयोगिता विधि की आवश्यकता है।

private static String getSubmittedFileName(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
        if (cd.trim().startsWith("filename")) {
            String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
            return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
        }
    }
    return null;
}
String fileName = getSubmittedFileName(filePart);

फ़ाइल का नाम प्राप्त करने के लिए MSIE फिक्स पर ध्यान दें। यह ब्राउज़र गलत फ़ाइल नाम के बजाय केवल फ़ाइल नाम के साथ पूर्ण फ़ाइल पथ भेजता है।

जब आप सर्वलेट 3.0 पर नहीं होते हैं, तो Apache Commons FileUpload का उपयोग करें

यदि आप अभी तक सर्वलेट 3.0 पर नहीं हैं (यह अपग्रेड करने के लिए समय के बारे में नहीं है?), मल्टीपार्ट फॉर्म डेटा अनुरोधों को पार्स करने के लिए आम अभ्यास अपाचे कॉमन्स फाइलअपलोड का उपयोग करना है। इसमें एक उत्कृष्ट उपयोगकर्ता मार्गदर्शिका और अक्सर पूछे जाने वाले प्रश्न (ध्यान से दोनों के माध्यम से जाना) है। ओ'रेली (" कॉस ") भी है MultipartRequest, लेकिन इसमें कुछ (मामूली) कीड़े हैं और सक्रिय रूप से वर्षों तक बनाए नहीं रखा गया है। मैं इसे इस्तेमाल करने की सलाह नहीं दूंगा। Apache Commons FileUpload अभी भी सक्रिय रूप से बनाए रखा गया है और वर्तमान में बहुत परिपक्व है।

Apache Commons FileUpload का उपयोग करने के लिए, आपको अपने वेबपृष्ठ में कम से कम निम्न फ़ाइलें होनी चाहिए /WEB-INF/lib:

आपका प्रारंभिक प्रयास सबसे अधिक संभावना में विफल रहा क्योंकि आप कॉमन्स IO को भूल गए।

अपाचे कॉमन्स FileUpload का उपयोग करते समय doPost()आपके UploadServletदिखने में कैसा हो सकता है, इसका एक किकऑफ़ उदाहरण है :

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (item.isFormField()) {
                // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                String fieldName = item.getFieldName();
                String fieldValue = item.getString();
                // ... (do your job here)
            } else {
                // Process form file field (input type="file").
                String fieldName = item.getFieldName();
                String fileName = FilenameUtils.getName(item.getName());
                InputStream fileContent = item.getInputStream();
                // ... (do your job here)
            }
        }
    } catch (FileUploadException e) {
        throw new ServletException("Cannot parse multipart request.", e);
    }

    // ...
}

यह बहुत महत्वपूर्ण है कि आप कॉल नहीं करते है getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader()एक ही अनुरोध पहले से पर आदि,। अन्यथा सर्वलेट कंटेनर अनुरोध निकाय को पढ़ेगा और पार्स करेगा और इस प्रकार Apache Commons FileUpload को एक खाली अनुरोध निकाय मिलेगा। Ao ServletFileUpload # parseRequest (अनुरोध) एक खाली सूची भी देखें ।

ध्यान दें FilenameUtils#getName()। यह फ़ाइल नाम प्राप्त करने के लिए एक MSIE फिक्स है। यह ब्राउज़र गलत फ़ाइल नाम के बजाय केवल फ़ाइल नाम के साथ पूर्ण फ़ाइल पथ भेजता है।

वैकल्पिक रूप से आप यह सब लपेट भी सकते हैं, Filterजिसमें यह सब स्वचालित रूप से हो जाता है और सामान को अनुरोध के समरूप में वापस डाल दिया जाता है ताकि आप request.getParameter()सामान्य तरीके से उपयोग जारी रख सकें और अपलोड की गई फ़ाइल को पुनः प्राप्त कर सकें request.getAttribute()आप इस ब्लॉग लेख में एक उदाहरण पा सकते हैं

GlassFish3 बग के लिए getParameter()अभी भी वापसी का समाधानnull

ध्यान दें कि 3.1.2 से अधिक पुराने ग्लासफिश संस्करणों में एक बग था जिसमें getParameter()अभी भी रिटर्न है null। यदि आप ऐसे कंटेनर को लक्षित कर रहे हैं और इसे अपग्रेड नहीं कर सकते हैं, तो आपको getPart()इस उपयोगिता विधि की मदद से मूल्य निकालने की आवश्यकता है :

private static String getValue(Part part) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8"));
    StringBuilder value = new StringBuilder();
    char[] buffer = new char[1024];
    for (int length = 0; (length = reader.read(buffer)) > 0;) {
        value.append(buffer, 0, length);
    }
    return value.toString();
}
String description = getValue(request.getPart("description")); // Retrieves <input type="text" name="description">

अपलोड की गई फ़ाइल सहेज रहा है (न getRealPath()ही उपयोग करें part.write()!)

डिस्क या डेटाबेस में प्राप्त किए गए InputStream( fileContentजैसा कि उपरोक्त कोड स्निपेट में दिखाया गया चर) को ठीक से सहेजने पर विस्तार से निम्नलिखित उत्तरों पर जाएं :

अपलोड की गई फ़ाइल सेवित करना

डिस्क या डेटाबेस से सहेजे गए फ़ाइल को ठीक से ग्राहक को वापस भेजने पर विस्तार से निम्नलिखित उत्तरों के लिए:

अजाक्सिंग फॉर्म

निम्नलिखित उत्तरों की ओर जाएं कि कैसे अजाक्स (और jQuery) का उपयोग करके अपलोड किया जाए। ध्यान दें कि प्रपत्र डेटा एकत्र करने के लिए सर्वलेट कोड को इसके लिए बदलने की आवश्यकता नहीं है! केवल जिस तरह से आप प्रतिक्रिया करते हैं उसे बदला जा सकता है, लेकिन यह बल्कि तुच्छ है (यानी जेएसपी को अग्रेषित करने के बजाय, केवल कुछ JSON या XML या यहां तक ​​कि सादे पाठ को प्रिंट करें जो अजाक्स कॉल के लिए जिम्मेदार स्क्रिप्ट के आधार पर उम्मीद कर रहा है)।


आशा है कि यह सब मदद करता है :)


क्षमा करें, मैं देख रहा था request.getParts("file")और उलझन में था x_x
कागमी साशा रोशलाइट नाइट

सर्वलेट 3.0 के साथ, यदि किसी MultipartConfigशर्त का उल्लंघन किया जाता है (उदाहरण के लिए maxFileSize), तो request.getParameter()रिटर्न को शून्य कहा जाता है। क्या यह उद्देश्य पर है? क्या होगा यदि मुझे कॉल करने से पहले कुछ नियमित (पाठ) पैरामीटर मिलते हैं getPart(और ए के लिए जाँच IllegalStateException)? इससे NullPointerExceptionपहले कि मैं जाँच के लिए एक मौका है फेंका जा सकता है IllegalStateException
वेव

@BalusC मैंने इससे संबंधित एक पोस्ट बनाया है, क्या आपको अंदाजा है कि मैं फ़ाइल API webKitDirectory से अतिरिक्त infos कैसे प्राप्त कर सकता हूं। यहाँ अधिक जानकारी stackoverflow.com/questions/45419598/…
राफ्टर

यदि आप Servlet 3.0 पर नहीं हैं और FileUpload ट्रिक का उपयोग करते हैं, तो मैंने पाया कि आप फ़ाइल को एक से अधिक बार अनुरोध से नहीं पढ़ सकते हैं। यदि आपको इस कार्यक्षमता की आवश्यकता है, तो आप स्प्रिंग के मल्टीपार्टफ़िल्टर को देखना चाहेंगे। इस पोस्ट का एक अच्छा काम करने का उदाहरण है: stackoverflow.com/a/21448087/1048376
छप

1
हाँ, अगर कोई String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
टॉमकैट

26

यदि आप स्प्रिंग MVC का उपयोग करते हैं, तो यह इस प्रकार है: (यदि कोई व्यक्ति इसे उपयोगी पाता है तो मैं इसे यहां छोड़ रहा हूं)।

enctype" multipart/form-data" (बालुसक के उत्तर के रूप में भी) विशेषता वाले फ़ॉर्म का उपयोग करें

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="Upload"/>
</form>

अपने नियंत्रक में, निम्नानुसार टाइप fileकरने के लिए अनुरोध पैरामीटर मैप करें MultipartFile:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void handleUpload(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
            byte[] bytes = file.getBytes(); // alternatively, file.getInputStream();
            // application logic
    }
}

आपको फ़ाइल नाम और आकार का उपयोग प्राप्त कर सकते हैं MultipartFileके getOriginalFilename()और getSize()

मैंने इसे स्प्रिंग संस्करण के साथ परीक्षण किया है 4.1.1.RELEASE


अगर मैं गलत नहीं हूं, तो इसके लिए जरूरी है कि आप अपने सर्वर के एप्लिकेशन कॉन्फिगर में सेम को कॉन्फ़िगर करें ...
केनी वर्डेन

11

आपको common-io.1.4.jarफ़ाइल को अपनी libनिर्देशिका में शामिल करने की आवश्यकता है , या यदि आप किसी भी संपादक की तरह काम कर रहे हैं, जैसे कि नेटबीन्स, तो आपको प्रोजेक्ट गुणों पर जाने की आवश्यकता है और बस JAR फ़ाइल को जोड़ना होगा और आपको किया जाएगा।

common.io.jarफ़ाइल को केवल Google में लाने के लिए या बस Apache Tomcat वेबसाइट पर जाएं जहां आपको इस फ़ाइल के मुफ्त डाउनलोड का विकल्प मिलता है। लेकिन एक बात याद रखें: यदि आप विंडोज यूजर हैं तो बाइनरी जिप फाइल डाउनलोड करें।


ढूँढ नहीं पा रहे .jarहैं लेकिन .zip। क्या आपका मतलब है .zip?
मालविंदर सिंह

10

टॉमकैट 6 ओ 7 में घटक या बाहरी पुस्तकालय के बिना

Web.xml फ़ाइल में अपलोड सक्षम करना :

http://joseluisbz.wordpress.com/2014/01/17/manually-installing-php-tomcat-and-httpd-lounge/#Eneable%20File%20Uploads

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

आप देख सकते हैं :

    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>

JSP का उपयोग करके फ़ाइलें अपलोड करना। फ़ाइलें:

Html फ़ाइल में

<form method="post" enctype="multipart/form-data" name="Form" >

  <input type="file" name="fFoto" id="fFoto" value="" /></td>
  <input type="file" name="fResumen" id="fResumen" value=""/>

JSP फ़ाइल या सर्वलेट में

    InputStream isFoto = request.getPart("fFoto").getInputStream();
    InputStream isResu = request.getPart("fResumen").getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte buf[] = new byte[8192];
    int qt = 0;
    while ((qt = isResu.read(buf)) != -1) {
      baos.write(buf, 0, qt);
    }
    String sResumen = baos.toString();

अपने कोड को अधिकतम-फ़ाइल-आकार , अधिकतम-अनुरोध-आकार और अन्य विकल्पों की तरह सर्वलेट आवश्यकताओं के लिए संपादित करें जिन्हें आप सेट कर सकते हैं ...


9

मैं हर एचटीएमएल फॉर्म के लिए सामान्य सर्वलेट का उपयोग कर रहा हूं चाहे इसमें अटैचमेंट हो या नहीं। यह सर्वलेट देता है TreeMapजहां कुंजियाँ jsp नाम हैं पैरामीटर और मान उपयोगकर्ता इनपुट हैं और सभी निर्देशिकाओं को निश्चित निर्देशिका में सहेजते हैं और बाद में आप अपनी पसंद की निर्देशिका का नाम बदल देते हैं। हमारे कनेक्शन कनेक्शन ऑब्जेक्ट वाले हमारे कस्टम इंटरफ़ेस हैं। मुझे लगता है कि यह आपकी मदद करेगा

public class ServletCommonfunctions extends HttpServlet implements
        Connections {

    private static final long serialVersionUID = 1L;

    public ServletCommonfunctions() {}

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException {}

    public SortedMap<String, String> savefilesindirectory(
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // Map<String, String> key_values = Collections.synchronizedMap( new
        // TreeMap<String, String>());
        SortedMap<String, String> key_values = new TreeMap<String, String>();
        String dist = null, fact = null;
        PrintWriter out = response.getWriter();
        File file;
        String filePath = "E:\\FSPATH1\\2KL06CS048\\";
        System.out.println("Directory Created   ????????????"
            + new File(filePath).mkdir());
        int maxFileSize = 5000 * 1024;
        int maxMemSize = 5000 * 1024;
        // Verify the content type
        String contentType = request.getContentType();
        if ((contentType.indexOf("multipart/form-data") >= 0)) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // maximum size that will be stored in memory
            factory.setSizeThreshold(maxMemSize);
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File(filePath));
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            // maximum file size to be uploaded.
            upload.setSizeMax(maxFileSize);
            try {
                // Parse the request to get file items.
                @SuppressWarnings("unchecked")
                List<FileItem> fileItems = upload.parseRequest(request);
                // Process the uploaded file items
                Iterator<FileItem> i = fileItems.iterator();
                while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (!fi.isFormField()) {
                        // Get the uploaded file parameters
                        String fileName = fi.getName();
                        // Write the file
                        if (fileName.lastIndexOf("\\") >= 0) {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\")));
                        } else {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\") + 1));
                        }
                        fi.write(file);
                    } else {
                        key_values.put(fi.getFieldName(), fi.getString());
                    }
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
        return key_values;
    }
}

@buhake sindi अरे क्या फ़ाइलपथ होना चाहिए अगर im लाइव सर्वर का उपयोग कर रहा है या मैं सर्वर पर फाइल अपलोड करके अपनी परियोजना को जी रहा हूं
अमनस

2
लाइव सर्वर में कोई भी निर्देशिका। यदि आप सर्वलेट में एक निर्देशिका बनाने के लिए एक कोड लिखते हैं, तो निर्देशिका लाइव श्रावक में बनाई जाएगी
अच्छा महसूस करें और प्रोग्रामिंग

8

स्प्रिंग एमवीसी के लिए मैं ऐसा करने के लिए घंटों से कोशिश कर रहा हूं और एक सरल संस्करण बनाने में कामयाब रहा, जो डेटा और छवि दोनों के लिए फॉर्म इनपुट लेने के लिए काम करता है।

<form action="/handleform" method="post" enctype="multipart/form-data">
  <input type="text" name="name" />
  <input type="text" name="age" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

संभाल करने वाला नियंत्रक

@Controller
public class FormController {
    @RequestMapping(value="/handleform",method= RequestMethod.POST)
    ModelAndView register(@RequestParam String name, @RequestParam int age, @RequestParam MultipartFile file)
            throws ServletException, IOException {

        System.out.println(name);
        System.out.println(age);
        if(!file.isEmpty()){
            byte[] bytes = file.getBytes();
            String filename = file.getOriginalFilename();
            BufferedOutputStream stream =new BufferedOutputStream(new FileOutputStream(new File("D:/" + filename)));
            stream.write(bytes);
            stream.flush();
            stream.close();
        }
        return new ModelAndView("index");
    }
}

आशा है ये मदद करेगा :)


क्या आप कृपया चयनित छवि फ़ॉर्म db mysql साझा कर सकते हैं और इसे jsp / html पर दिखा सकते हैं?
वेद प्रकाश

6

इस समस्या का एक अन्य स्रोत तब होता है जब आप जेरोनिमो को इसके एम्बेडेड टोमैट के साथ उपयोग कर रहे हैं। इस मामले में, कॉमन्स-आईओ और कॉमन्स-फाइलअपलोड के परीक्षण के कई पुनरावृत्तियों के बाद, कॉमन्स-एक्सएक्सएक्स जार को संभालने वाले मूल अभिभावक से समस्या उत्पन्न होती है। इसे रोकना होगा। दुर्घटना हमेशा हुई:

fileItems = uploader.parseRequest(request);

ध्यान दें कि फ़ाइल प्रकारों की सूची प्रकार कॉमन-फाइलअप के वर्तमान संस्करण के साथ बदल गया है, विशेष List<FileItem>रूप से पूर्व संस्करणों के विपरीत जहां यह सामान्य था List

मैंने वास्तविक त्रुटि का पता लगाने के लिए अपने ग्रहण प्रोजेक्ट में कॉमन्स-फाइलअपलोड और कॉमन्स-आईओ के लिए स्रोत कोड जोड़ा और अंत में कुछ अंतर्दृष्टि मिली। सबसे पहले, अपवाद फेंक दिया गया प्रकार थ्रोएबल है जो न तो फ़ाइलइओसेप्शन और न ही अपवाद भी है (ये फंस नहीं जाएंगे)। दूसरा, त्रुटि संदेश इस बात में बाधक है कि इसमें वर्ग नहीं पाया गया क्योंकि अक्ष 2 को कॉमन्स-आईओ नहीं मिला। Axis2 का उपयोग मेरी परियोजना में बिल्कुल नहीं किया गया है, लेकिन मानक स्थापना के हिस्से के रूप में Geronimo रिपॉजिटरी उपनिर्देशिका में एक फ़ोल्डर के रूप में मौजूद है।

अंत में, मुझे 1 जगह मिली जिसने एक काम करने वाला समाधान पेश किया जिसने मेरी समस्या को सफलतापूर्वक हल किया। आपको तैनाती योजना में मूल लोडर से जार को छिपाना होगा। यह नीचे दिखाए गए मेरी पूरी फ़ाइल के साथ geronimo-web.xml में डाला गया था।

Pasted from <http://osdir.com/ml/user-geronimo-apache/2011-03/msg00026.html> 



<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web:web-app xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
    <dep:environment>
        <dep:moduleId>
            <dep:groupId>DataStar</dep:groupId>
            <dep:artifactId>DataStar</dep:artifactId>
            <dep:version>1.0</dep:version>
            <dep:type>car</dep:type>
        </dep:moduleId>

<!--Don't load commons-io or fileupload from parent classloaders-->
        <dep:hidden-classes>
            <dep:filter>org.apache.commons.io</dep:filter>
            <dep:filter>org.apache.commons.fileupload</dep:filter>
        </dep:hidden-classes>
        <dep:inverse-classloading/>        


    </dep:environment>
    <web:context-root>/DataStar</web:context-root>
</web:web-app>

0

यहाँ apache commons-fileupload का उपयोग करके एक उदाहरण दिया गया है:

// apache commons-fileupload to handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(DataSources.TORRENTS_DIR()));
ServletFileUpload fileUpload = new ServletFileUpload(factory);

List<FileItem> items = fileUpload.parseRequest(req.raw());
FileItem item = items.stream()
  .filter(e ->
  "the_upload_name".equals(e.getFieldName()))
  .findFirst().get();
String fileName = item.getName();

item.write(new File(dir, fileName));
log.info(fileName);

0

फ़ाइलों और इनपुट नियंत्रणों के लिए सबसे आसान तरीका एक अरब पुस्तकालयों को w / आउट कर सकता है:

  <%
  if (request.getContentType()==null) return;
  // for input type=text controls
  String v_Text = 
  (new BufferedReader(new InputStreamReader(request.getPart("Text1").getInputStream()))).readLine();    

  // for input type=file controls
  InputStream inStr = request.getPart("File1").getInputStream();
  char charArray[] = new char[inStr.available()];
  new InputStreamReader(inStr).read(charArray);
  String contents = new String(charArray);
  %>

-1

आप jsp / सर्वलेट का उपयोग करके फ़ाइल अपलोड कर सकते हैं।

<form action="UploadFileServlet" method="post">
  <input type="text" name="description" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

दूसरी ओर सर्वर साइड। निम्नलिखित कोड का उपयोग करें।

     package com.abc..servlet;

import java.io.File;
---------
--------


/**
 * Servlet implementation class UploadFileServlet
 */
public class UploadFileServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public UploadFileServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.sendRedirect("../jsp/ErrorPage.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

            PrintWriter out = response.getWriter();
            HttpSession httpSession = request.getSession();
            String filePathUpload = (String) httpSession.getAttribute("path")!=null ? httpSession.getAttribute("path").toString() : "" ;

            String path1 =  filePathUpload;
            String filename = null;
            File path = null;
            FileItem item=null;


            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                String FieldName = "";
                try {
                    List items = upload.parseRequest(request);
                    Iterator iterator = items.iterator();
                    while (iterator.hasNext()) {
                         item = (FileItem) iterator.next();

                            if (fieldname.equals("description")) {
                                description = item.getString();
                            }
                        }
                        if (!item.isFormField()) {
                            filename = item.getName();
                            path = new File(path1 + File.separator);
                            if (!path.exists()) {
                                boolean status = path.mkdirs();
                            }
                            /* START OF CODE FRO PRIVILEDGE*/

                            File uploadedFile = new File(path + Filename);  // for copy file
                            item.write(uploadedFile);
                            }
                        } else {
                            f1 = item.getName();
                        }

                    } // END OF WHILE 
                    response.sendRedirect("welcome.jsp");
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }   
    }

}

-1
DiskFileUpload upload=new DiskFileUpload();

इस ऑब्जेक्ट से आपको फ़ाइल आइटम और फ़ील्ड प्राप्त करने होंगे तब यो सर्वर में स्टोर किया जा सकता है जैसे कि:

String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);

-2

फ़ाइल के लिए कई फ़ाइल भेजना है enctype="multipart/form-data"
और हमें multiple="multiple"इनपुट टैग में कई फ़ाइल उपयोग भेजना है

<form action="upload" method="post" enctype="multipart/form-data">
 <input type="file" name="fileattachments"  multiple="multiple"/>
 <input type="submit" />
</form>

2
हम getPart ("fileattachments") के बारे में कैसे करेंगे ताकि हमें इसके बजाय भागों की एक सरणी मिल जाए? मुझे नहीं लगता कि getPart कई फ़ाइलों के लिए काम करेगा?
साइबरएम

-2

HTML पेज

<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="UploadServlet" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html> 

सर्व करें

// Import required java libraries
import java.io.*;
import java.util.*;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {

   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = 
             getServletContext().getInitParameter("file-upload"); 
   }
   public void doPost(HttpServletRequest request, 
               HttpServletResponse response)
              throws ServletException, java.io.IOException {
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      if( !isMultipart ){
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try{ 
      // Parse the request to get file items.
      List fileItems = upload.parseRequest(request);

      // Process the uploaded file items
      Iterator i = fileItems.iterator();

      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      while ( i.hasNext () ) 
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {
            // Get the uploaded file parameters
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            // Write the file
            if( fileName.lastIndexOf("\\") >= 0 ){
               file = new File( filePath + 
               fileName.substring( fileName.lastIndexOf("\\"))) ;
            }else{
               file = new File( filePath + 
               fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;
            out.println("Uploaded Filename: " + fileName + "<br>");
         }
      }
      out.println("</body>");
      out.println("</html>");
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }
   public void doGet(HttpServletRequest request, 
                       HttpServletResponse response)
        throws ServletException, java.io.IOException {

        throw new ServletException("GET method used with " +
                getClass( ).getName( )+": POST method required.");
   } 
}

web.xml

सर्वलेट UploadServlet के ऊपर संकलन करें और निम्नानुसार web.xml फ़ाइल में आवश्यक प्रविष्टि बनाएँ।

<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.