Come caricare i file sul server utilizzando JSP / Servlet?

Mar 11 2010

Come posso caricare file sul server utilizzando JSP / Servlet? Ho provato questo:

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

Tuttavia, ottengo solo il nome del file, non il contenuto del file. Quando aggiungo enctype="multipart/form-data"a <form>, poi request.getParameter()ritorna null.

Durante la ricerca mi sono imbattuto in Apache Common FileUpload . Ho provato questo:

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

Sfortunatamente, il servlet ha generato un'eccezione senza un messaggio e una causa chiari. Ecco lo stacktrace:

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)

Risposte

1203 BalusC Mar 11 2010 at 19:27

introduzione

Per sfogliare e selezionare un file da caricare è necessario un <input type="file">campo HTML nel modulo. Come indicato nella specifica HTML, è necessario utilizzare il POSTmetodo e l' enctypeattributo del modulo deve essere impostato su "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>

Dopo aver inviato un modulo di questo tipo, i dati del modulo binario in più parti sono disponibili nel corpo della richiesta in un formato diverso rispetto a quando enctypenon è impostato.

Prima di Servlet 3.0, l'API servlet non supportava nativamente multipart/form-data. Supporta solo l'enctype di modulo predefinito di application/x-www-form-urlencoded. Le request.getParameter()consorti e tornerebbero tutte nullquando si utilizzano i dati del modulo multipart. È qui che è entrato in scena il famoso Apache Commons FileUpload .

Non analizzarlo manualmente!

In teoria puoi analizzare tu stesso il corpo della richiesta in base a ServletRequest#getInputStream(). Tuttavia, questo è un lavoro preciso e noioso che richiede una conoscenza precisa di RFC2388 . Non dovresti provare a farlo da solo o copiare un codice senza libreria creato altrove su Internet. Molte fonti online hanno fallito duramente in questo, come roseindia.net. Vedi anche caricamento di file pdf . Dovresti piuttosto usare una vera libreria che viene usata (e implicitamente testata!) Da milioni di utenti per anni. Una tale libreria ha dimostrato la sua robustezza.

Quando sei già su Servlet 3.0 o più recente, utilizza l'API nativa

Se stai utilizzando almeno Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3, ecc.), Puoi semplicemente utilizzare l'API standard fornita HttpServletRequest#getPart()per raccogliere i singoli elementi di dati del modulo multipart (la maggior parte delle implementazioni di Servlet 3.0 utilizza effettivamente Apache Commons FileUpload sotto le coperte per questo!). Inoltre, i normali campi del modulo sono disponibili getParameter()nel modo consueto.

Per prima cosa annota il tuo servlet con @MultipartConfigper fargli riconoscere e supportare le multipart/form-datarichieste e quindi mettersi getPart()al lavoro:

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

Quindi, implementalo doPost()come segue:

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)
}

Nota il Path#getFileName(). Questa è una correzione di MSIE per ottenere il nome del file. Questo browser invia erroneamente il percorso completo del file lungo il nome anziché solo il nome del file.

Nel caso in cui si disponga di un <input type="file" name="file" multiple="true" />caricamento di più file, raccoglierli come di seguito (sfortunatamente non esiste un metodo come 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)
    }
}

Quando non sei ancora su Servlet 3.1, ottieni manualmente il nome del file inviato

Nota che è Part#getSubmittedFileName()stato introdotto in Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4, ecc.). Se non sei ancora su Servlet 3.1, hai bisogno di un metodo di utilità aggiuntivo per ottenere il nome del file inviato.

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);

Notare la correzione MSIE per ottenere il nome del file. Questo browser invia erroneamente il percorso completo del file lungo il nome anziché solo il nome del file.

Quando non sei ancora su Servlet 3.0, usa Apache Commons FileUpload

Se non sei ancora su Servlet 3.0 (non è ora di eseguire l'aggiornamento?), La pratica comune è quella di utilizzare Apache Commons FileUpload per analizzare le richieste di dati del modulo multiparte. Ha un'eccellente Guida per l'utente e FAQ (analizzale attentamente entrambe). C'è anche O'Reilly (" cos ") MultipartRequest, ma ha alcuni bug (minori) e non viene più mantenuto attivamente per anni. Non consiglierei di usarlo. Apache Commons FileUpload è ancora mantenuto attivamente e attualmente è molto maturo.

Per utilizzare Apache Commons FileUpload, devi avere almeno i seguenti file nella tua webapp /WEB-INF/lib:

  • commons-fileupload.jar
  • commons-io.jar

Il tuo tentativo iniziale è fallito molto probabilmente perché hai dimenticato l'IO comune.

Ecco un esempio iniziale di come potrebbe apparire il doPost()tuo UploadServletquando usi Apache Commons FileUpload:

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);
    }

    // ...
}

E 'molto importante che non si chiama getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), ecc sulla stessa richiesta in anticipo. Altrimenti il ​​contenitore servlet leggerà e analizzerà il corpo della richiesta e quindi Apache Commons FileUpload otterrà un corpo della richiesta vuoto. Vedere anche ao ServletFileUpload # parseRequest (richiesta) restituisce un elenco vuoto .

Nota il FilenameUtils#getName(). Questa è una correzione di MSIE per ottenere il nome del file. Questo browser invia erroneamente il percorso completo del file lungo il nome anziché solo il nome del file.

In alternativa puoi anche racchiudere tutto questo in un Filterche analizza tutto automaticamente e rimette il materiale nel parametermap della richiesta in modo che tu possa continuare usando request.getParameter()il solito modo e recuperare il file caricato da request.getAttribute(). Puoi trovare un esempio in questo articolo del blog .

Soluzione per il bug di GlassFish3 che getParameter()si ripresenta ancoranull

Nota che le versioni di Glassfish precedenti alla 3.1.2 avevano un bug in cui getParameter()ritorna ancora null. Se stai prendendo di mira un tale contenitore e non puoi aggiornarlo, devi estrarre il valore da getPart()con l'aiuto di questo metodo di utilità:

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">

Salvataggio del file caricato (non usare getRealPath()part.write()!)

Vai alle seguenti risposte per i dettagli sul salvataggio corretto del ottenuto InputStream(la fileContentvariabile come mostrato nei frammenti di codice sopra) su disco o database:

  • Metodo consigliato per salvare i file caricati in un'applicazione servlet
  • Come caricare un'immagine e salvarla nel database?
  • Come convertire una parte in Blob, in modo da poterla memorizzare in MySQL?

Pubblicazione del file caricato

Vai alle seguenti risposte per i dettagli su come servire correttamente il file salvato dal disco o dal database al client:

  • Carica le immagini dall'esterno della cartella webapps / webcontext / deploy utilizzando il tag o
  • Come recuperare e visualizzare le immagini da un database in una pagina JSP?
  • Il modo più semplice per fornire dati statici dall'esterno del server delle applicazioni in un'applicazione Web Java
  • Modello astratto per servlet di risorse statiche che supporta la memorizzazione nella cache HTTP

Ajaxifying la forma

Vai alle seguenti risposte su come caricare utilizzando Ajax (e jQuery). Tieni presente che il codice servlet per raccogliere i dati del modulo non deve essere modificato per questo! Solo il modo in cui rispondi può essere cambiato, ma questo è piuttosto banale (cioè invece di inoltrare a JSP, stampa semplicemente un po 'di JSON o XML o anche testo normale a seconda di ciò che lo script responsabile della chiamata Ajax si aspetta).

  • Come caricare i file sul server utilizzando JSP / Servlet e Ajax?
  • Invia un file come multipart tramite xmlHttpRequest
  • Caricamento di file HTML5 su Java Servlet

Spero che tutto questo aiuti :)

26 Amila Aug 26 2015 at 19:39

Se ti capita di utilizzare Spring MVC, ecco come: (Lo lascio qui nel caso qualcuno lo trovi utile).

Utilizza un modulo con l' enctypeattributo impostato su " multipart/form-data" (come la risposta di BalusC)

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

Nel controller, mappare il parametro di richiesta fileper MultipartFiledigitare come segue:

@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
    }
}

È possibile ottenere il nome del file e la dimensione con MultipartFiles' getOriginalFilename()e getSize().

L'ho provato con la versione Spring 4.1.1.RELEASE.

12 joseluisbz Jan 25 2014 at 12:44

Senza componente o libreria esterna in Tomcat 6 o 7

Abilitazione del caricamento nel file web.xml :

http://joseluisbz.wordpress.com/2014/01/17/manually-installing-php-tomcat-and-httpd-lounge/#Enabling%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>

COME PUOI VEDERE :

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

Caricamento di file utilizzando JSP. File:

Nel file 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=""/>

Nel file JSP o nel servlet

    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();

Modifica il tuo codice in base ai requisiti del servlet, come max-file-size , max-request-size e altre opzioni che puoi impostare ...

11 Pranav May 17 2012 at 18:11

Hai bisogno che il common-io.1.4.jarfile sia incluso nella tua libdirectory, o se stai lavorando in qualsiasi editor, come NetBeans, allora devi andare alle proprietà del progetto e aggiungere semplicemente il file JAR e avrai finito.

Per ottenere il common.io.jarfile basta cercarlo su google o semplicemente andare sul sito Web di Apache Tomcat dove si ottiene l'opzione per il download gratuito di questo file. Ma ricorda una cosa: scarica il file ZIP binario se sei un utente Windows.

9 feelgoodandprogramming Jan 08 2013 at 12:50

Sto usando un servlet comune per ogni modulo HTML, indipendentemente dal fatto che abbia allegati o meno. Questo servlet restituisce un TreeMapdove le chiavi sono nome jsp Parametri e valori sono input utente e salva tutti gli allegati in una directory fissa e successivamente si rinomina la directory di tua scelta. Qui Connections è la nostra interfaccia personalizzata con oggetto di connessione. Penso che questo ti aiuterà

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;
    }
}
8 ShivangiGupta Jul 16 2017 at 02:42

Per Spring MVC ho provato per ore a farlo e sono riuscito ad avere una versione più semplice che ha funzionato per prendere forma di input sia dati che immagini.

<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 da gestire

@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");
    }
}

Spero che sia d'aiuto :)

6 GeoffreyMalafsky Sep 10 2013 at 22:15

Un'altra fonte di questo problema si verifica se si utilizza Geronimo con il suo Tomcat incorporato. In questo caso, dopo molte iterazioni di test commons-io e commons-fileupload, il problema sorge da un classloader genitore che gestisce i jar commons-xxx. Questo deve essere evitato. L'incidente si è sempre verificato a:

fileItems = uploader.parseRequest(request);

Si noti che il tipo di elenco di fileItems è stato modificato con la versione corrente di commons-fileupload in modo specifico List<FileItem>rispetto alle versioni precedenti in cui era generico List.

Ho aggiunto il codice sorgente per commons-fileupload e commons-io nel mio progetto Eclipse per tracciare l'errore effettivo e finalmente ho ottenuto alcune informazioni. Innanzitutto, l'eccezione generata è di tipo Throwable, non di FileIOException dichiarata e nemmeno di Exception (questi non verranno intercettati). In secondo luogo, il messaggio di errore è offuscato in quanto afferma che la classe non è stata trovata perché axis2 non è riuscito a trovare commons-io. Axis2 non è affatto utilizzato nel mio progetto ma esiste come una cartella nella sottodirectory del repository Geronimo come parte dell'installazione standard.

Infine, ho trovato 1 posto che rappresentava una soluzione funzionante che ha risolto con successo il mio problema. È necessario nascondere i vasi dal caricatore principale nel piano di distribuzione. Questo è stato inserito in geronimo-web.xml con il mio file completo mostrato di seguito.

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>
thouliha May 21 2015 at 23:49

Ecco un esempio utilizzando 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);
LakinduHewawasam Nov 24 2020 at 17:49

Devi prima impostare l'attributo enctype del modulo su "multipart / form-data"

Questo è mostrato di seguito.

<form action="Controller" method="post" enctype="multipart/form-data">
     <label class="file-upload"> Click here to upload an Image </label>
     <input type="file" name="file" id="file" required> 
</form>

Quindi, nel servlet "Controller" aggiungere l'annotazione per una multiparte per indicare che i dati multiparte vengono elaborati nel servlet.

Dopo aver fatto ciò, recupera la parte inviata tramite il modulo e quindi recupera il nome del file (con percorso) del file inviato. Utilizzare questo per creare un nuovo file nel percorso desiderato e scrivere le parti del file nel file appena creato per ricreare il file.

Come mostrato di seguito:

@MultipartConfig

public class Controller extends HttpServlet {

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

    private void addProduct(HttpServletRequest request, HttpServletResponse response) {
        Part filePart = request.getPart("file");
        String imageName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();

        String imageSavePath = "specify image path to save image"; //path to save image
        FileOutputStream outputStream = null;
        InputStream fileContent = null;

        try {
            outputStream = new FileOutputStream(new File(imageSavePath + File.separator + imageName));
            //creating a new file with file path and the file name
            fileContent = filePart.getInputStream();
            //getting the input stream
            int readBytes = 0;
            byte[] readArray = new byte[1024];
            //initializing a byte array with size 1024

            while ((readBytes = fileContent.read(readArray)) != -1) {
                outputStream.write(readArray, 0, readBytes);
            }//this loop will write the contents of the byte array unitl the end to the output stream
        } catch (Exception ex) {
            System.out.println("Error Writing File: " + ex);
        } finally {
            if (outputStream != null) {
                outputStream.close();
                //closing the output stream
            }
            if (fileContent != null) {
                fileContent.close();
                //clocsing the input stream
            }
        }
    }
}