giovedì 24 luglio 2014

UPLOAD FILE CON JAVA WEB

Sia per sviluppare un DMS che un sistema di storage web (DropBox o Google Drive) può essere necessario implementare una funzione per il caricamento di file attraverso una web application. Vediamo come farla utilizzando una Servlet Java.


Partiamo dalle poche istruzioni da inserire nella pagina HTML/JSP:
<form method="post" action="/uploadFile" enctype="multipart/form-data">
File
<input type="file" name="upfile"/>
<input type="submit"/>

Prima di procedere al codice che gestisce la richiesta HTTP-POST lato server è necessario importare nel progetto la libreria Apache commons-fileupload, direttamente dipendente dalla libreria Apache commons.

Il codice

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tomcat.util.http.fileupload.*;

public class resourceAddServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            //uploading file
            DiskFileUpload uploader = new DiskFileUpload();
            uploader.setSizeMax(1000000000);
            uploader.setSizeThreshold(4096);
            uploader.setRepositoryPath("C:\\TEMP\\");
            //parsing the request
            java.util.List files = uploader.parseRequest(request);
            //prepare the output directory
            String destination = "C:\\MYSERVER\\";
            //obtaining the file
            FileItem fileitem = ((FileItem) files.get(0));
            String res = retrieveFilename(fileitem.getName());
            //writing file to disk
            fileitem.write(new java.io.File(destination + res));
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            out.close();
        }
    }
    
    private String retrieveFilename(String path) {
        path = path.replaceAll("\\\\", "/");
        char symbol;
        String toret = "";
        for (int i = (path.length() - 1); i >= 0; i--) {
            symbol = path.charAt(i);
            if (symbol == '/') {
                break;
            } else {
                toret = symbol + toret;
            }
        }
        return toret;
    }
}


Tramite uploader.setSizeMax e uploader.setSizeThreshold è possibile limitare la dimensione dei file caricati. Consiglio anche di effettuare un controllo dell'esistenza di un file con lo stesso nome prima di sovrascrivere.

Nessun commento:

Posta un commento