domenica 20 novembre 2011

Upload di un file via Web

Per effettuare l'upload di File via Web è molto utile utilizzare la libreria commons-fileupload-1.2.2.jar (per usarla c'è bisogno di avere nel classpath anche commons-io.jar.

Bisogna ricordarsi di scrivere dentro il tag Form ENCTYPE="multipart/form-data" altrimenti la chiamata al metodo isMultipartContent(request) torna false.

Ecco il form

<form name="caricaBilancio" id="caricaBilancio" ENCTYPE="multipart/form-data" action="CaricaBilancio" method="post">
<div class="contentResultCol" id="contentResultCol_M1472946676">
<div class="resultBodyObject" id="resultBodyObject_M1472946676">

<table  class="filterTable">
<tr class="filterTr"><td>Acquisisci *: </td>

<td>
<select id="ddlScelta" name="ddlScelta" class="input">
            <option value="B" selected="selected">Bilancio Azienda</option>
            <option value="V">Votazione Azienda</option>
        </select>


</td>
</tr>
<tr class="filterTr">
<td class="filterLabelTd" id="filterLabelTd_M994447656" valign="top">

        <span id="FormModifica_dataCostituzione_label">File Excel *</span>
        </td>
        <td class="filterInputTd" valign="top"><!-- CalendarField#input -->
        <span id="span_FormModifica_dataCostituzione"> <!-- FormField#boundedField -->
        <span class="" alt="" title=""> <input id="fileExcel"
            name="fileExcel" class="input" type="file" value="" size="100" width="100" title="FileExcel"/> </span> </span></td>
</tr>
</table>
<table class="buttonTable" align="left">
    <tr>
        <td><input class="inputButton" id="annulla"    type="button" name="Annulla"  title="Annulla"  value="Annulla" onclick="javascript:self.close();"/></td>
        <td><input class="inputButton" id="salva"   type="button" name="btnInvio" value="Invia Richiesta"    title="Invia Richiesta" onclick="javascript:validateForm()  "  /></td>
        <td><input class="inputButton" id="reset"   type="reset"  name="Cancella" title="Cancella" value="Cancella" /></td>
        <td><input class="inputButton" id="spiega"    type="button" name="Guida"  title="Guida"  value="Mostra guida" onclick="javascript:showhide('spiegazioni')"/></td>
      
   
    </tr>
</table>
</form>


Ecco il codice della Servlet che  effettuare la lettura

RequestDispatcher rd=request.getRequestDispatcher("jsp/CaricaBilancio.jsp");
        try
        {
        String valoreRichiesta="";
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if(isMultipart){
            // Create a factory for disk-based file items
            FileItemFactory factory = new DiskFileItemFactory();

            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            List<FileItem> items=upload.parseRequest(request);
            Iterator iter = items.iterator();
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();

                if (item.isFormField()) {
                    String name = item.getFieldName();
                   valoreRichiesta = item.getString();
                } else {
                    String fieldName = item.getFieldName();
                    String fileName = item.getName();
                    String contentType = item.getContentType();
                    boolean isInMemory = item.isInMemory();
                    long sizeInBytes = item.getSize();
                    log.info(String.format("Upload di file %s di tipo %s e di size %d", fileName,contentType,sizeInBytes));
                    if("B".equals(valoreRichiesta)){
                   
                    InputStream is=item.getInputStream();
                    ExcelCaricamentoDao ed=ExcelCaricamentoDaoImpl.getInstance();
                    BilancioExcel bil= ed.getBilancioFromExcel(is);
                    ed.persistBilancio(bil);
                    request.setAttribute("ok", "Inserimento del bilancio terminato correttamente");
                    }
                    else
                    {
                        InputStream is=item.getInputStream();
                        ExcelCaricamentoDao ed=ExcelCaricamentoDaoImpl.getInstance();
                        VotazioneExcel v=ed.getVotazioniFromExcel(is);
                        ed.persistVotazione(v);
                       
                        request.setAttribute("ok", "Inserimento della votazione terminato correttamente");
                    }
                   
                }
            }
           
        }
        }
        catch(Exception fex){
            String messaggio="";
            if(fex instanceof SQLException){
                if(fex.getMessage().startsWith("Duplicate entry"))
                {
                    messaggio="Attenzione nel foglio caricato sono presenti dei dati che non rispettano i vincoli di univocità del database. " +
                            " Si consiglia di ricontrollare di aver rispettato tutte le regole di caricamento. <br> Dettaglio Messaggio:";
                    messaggio=messaggio+fex.getMessage();
                }
                else
                {
                    messaggio="Attenzione si sono verificati dei problemi nell'inserimento dati sul db. <br>" +
                            "Si consiglia di ricontrollare di aver rispettato tutte le regole di caricamento. Dettaglio Messaggio: ";
                    messaggio=messaggio+fex.getMessage();
                }
            }
            if(messaggio.equals(""))
            {
                messaggio=fex.getMessage();
            }
            request.setAttribute("error", messaggio);
        }
        finally{
            rd.forward(request, response);
        }

Per la lettura del file Excel è molto utile utilizzare Apache POI (vedi post precedenti).

Nessun commento:

Posta un commento