File Upload Con le Servlet
Posted by Santarelli Luca | Filed under Java Servlet

Molto spesso capita di dover inviare sul server dati che non siano soltanto testuali, ma anche file, come ad esempio immagini, documenti. Per questo dobbiamo usare delle form particolari, ovvero con enctype=”multipart/form-data” con il quale indichiamo al server che stiamo inviando dati di tipo diverso dal solito testo, come ci indica la specifica w3c.
Nativamente le servlet, e java non prevede questo tipo di iterazione, per questo dobbiamo estendere il funzionamento del nostro applicatico includendo una nuova libreria rilasciata da APACHE common che potrete scaricare dal sito ufficiale APACHE: apache-common-file-upload. Per le servlet dovrete scegliere il file Binary, in quanto a noi occorre solo la libreria
Effettuato il download della libreria collegate il file commons-fileupload-1.x.x.jar (che trovate dentro a lib del file appena scaricato) dentro le vostre librerie di progetto o di sistema. Perfetto ora avremo il supporto necessario per iniziare.
Progettazione di FORM con enctype=”multipart/form-data”.
Dalla parte dell’HTML il discorso è abbastanza semplice, dobbiamo scrivere una semplice form che ci permetta di fare l’upload di uno o più campi input, infatti il sistema che sto per mostrare permette di spedire alla form 1..N file rendendo abbastanza flessibile il sistema per un numero qualsiasi di campi.
<form action=”servletupload” method=”post” enctype=”multipart/form-data”>
<label class=”forform” for=”nome”>nome da dare all’immagine</label>
<input type=”text” name=”nome” size=”30″ tabindex=”30″ />
</form>
In questo caso avremo un campo testo e 1 campo di tipo file, al submit della form ci risponde la servletupload. Possiamo estendere l’esempi con tanti campi testo e file, io ho fatto l’esempio più semplice.
Progettazione Della Servlet File Upload
Dal lato server dobbiamo progettare una servlet che raccolga la richiesta del client e la elabori a dovere, iniziamo ad analizzare gli import che dobbiamo fare
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.*;
import org.apache.commons.fileupload.disk.*;
Se avete dei problemi sull’import di qualche classe controllate le vostre libreria e ad esempio se avete problemi su import java.io.File; includete la libreria commons-io.jar gia presente dentro netbeans.
Adesso arriviamo alla parte più importante:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
dentro la ProcessRequest dobbiamo andare ad implementare il codice che ci esaminerà la richiesta della form
String Pathname=”/upload/”;
Map<String, String> val = new HashMap();if (ServletFileUpload.isMultipartContent(request)) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items;
try {
//analizzo la richiesta
items = upload.parseRequest(request);
Iterator<FileItem> it = items.iterator();
while (it.hasNext()) {
//singolo elemento della richiesta
FileItem item = it.next();
String nome = item.getFieldName();//nome del campo input
if (item.isFormField()) { //l’elemento è un campo semplice
val.put(nome,item.getString());//metto dentro a la lista val l’elemento ad esempio per una modifica successiva va dichiarata come private Object val; nella classe principale della servlet} else {
String st = getServletContext().getRealPath(”")+Pathname;
gf.MkDir(st);//questa è una servlet che trovate in download per la gestione dei file, si chiama Filemanager.java, e dovete implementare la variabile come:private FileManager gf;
String fileName = item.getName();
String imgname=val.get(”nome”);
name=imgname.replace(” “,”_”);
File f = new File(getServletContext().getRealPath(”")+Pathname+name+”.jpg”);
item.write(f);}
}
} catch (FileUploadException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
In questa parte di codice vado ad analizzare la richiesta e rinomino l’immagine con il nome che do al campo testo, salvandola su disco nella cartella upload, che dovrete andare ad inserire dento path/del/progetto/web/upload e accertarvi che abbia i permessi in scrittura, il codice non è chiarissimo, ma potete ben vedere le caratteristiche principali, se volete capire meglio il contesto andate alla sezione di download delle servlet, li troverete il progetto webmovie dove sono trattati questi argomenti anche in maniera complessa. Ricordatevi che per vedere se il processo è andato a buon fine dovrete leggere il file dentro la cartella BUILD. L’oggetto Val l’ho usato per salvare tutti i dati della form, infatti visto che in questo pezzo di codice scorro la request, allora ottimizzo il codice, inserendola dentro un oggetto chiamato val, che andrò a scorrere se ad esempio devo fare subito dopo una query di inserimento, come sempio:
inserimento=acc.QueryInsert(”INSERT INTO `artisti`(`id`,`nome`,`cognome`,`ruolo`,`biografia`)”+
“VALUES (null,’”+val.get(”nome”)+”‘,’”+val.get(”cognome”)+”‘,’”+val.get(”ruolo”)+”‘,’”+biografia+”‘)”);
Per oggi è tutto, Buon Lavoro, per problemi scrivete nei commenti…
No related posts.
Articoli correlati elaborati dal plugin Yet Another Related Posts.
Tags: Configurare, Java, Programmare
Scritto da Santarelli Luca sabato, 21st febbraio , 2009 13:47 Letture:« Configurare più VirtualHost Sullo Stesso IP con Apache2 | Come Evitare le SQL Injection »
One Response to “File Upload Con le Servlet”
-
laura Says:
gennaio 13th, 2010 at 13:18grazie mille per il codice!mi ha aiutato a risolvere un baco che avevo da 2 settimane!
blogflux