|
Le librerie che useremo sono contenute nell'archivio "commons-fileupload.jar" che dovrà essere presente, assieme alle librerie di base di Struts, all'interno della cartella "lib" della nostra web application. Il package che ci interessa, e che dovremo importare nella nostra action è "org.apache.struts.upload". Cominciamo con lo scrivere il codice html che ci serve per visualizzare un form utilizzando i custom tag di Struts: <!-- Il form deve avere l'Encoding Type settato a "multipart/form-data" affinchè si possa manipolare un file --> <html:form action="/uploadAction" enctype="multipart/form-data"> <table align="center" border="2" style="border-collapse: collapse"> <tr> <td align="center"><font size="4" color="yellow">Descrizione</font></td> <td colspan="2"> <!-- Inseriamo una textarea nella quale inserire una breve descrizione del file --> <html:textarea property="text" cols="33" rows="2" /> </td> </tr> <tr> <td align="center">File</td> <td> <!-- Inseriamo un campo "file" che permetterà di scegliere un file dal filesystem locale --> <html:file property="myFile"/> </td> <td> <!-- Infine inseriamo il pulsante di submit che invierà i dati all'action "uploadAction" --> <html:submit value="SALVA"/> </td> </tr> </table> </html:form> Naturalmente, affinchè sia possibile utilizzare i custom tag di Struts, dovremo porre in testa alla jsp la seguente riga: <%@taglib uri="/tags/struts-html" prefix="html" %> Per ricavare i dati dal form ci servirà un Bean che abbia tante variabili di classe quanti sono i campi del form e i relativi accessors: public final class UploadBeanForm extends ActionForm { private String text = null; private FormFile myFile = null; public void setText(String text){ this.text=text; } public String getText(){ return text; } public void setMyFile(FormFile myFile){ this.myFile=myFile; } public FormFile getMyFile(){ return myFile; } public void reset(ActionMapping mapping, HttpServletRequest request){ this.text=null; this.myFile=null; } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){ ActionErrors errors = new ActionErrors(); return errors; } } A questo punto andiamo a vedere il codice relativo alla Action che manipolerà i dati provenienti dal form: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.struts.action.*; import org.apache.struts.upload.*; public class UploadAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { try { // istanziamo il nostro ActionForm UploadBeanForm theForm = (UploadBeanForm) form; // ricaviamo il testo inserito dall'utente String text = theForm.getText(); // ricaviamo l'immagine del file di cui si vuole fare l'upload FormFile file = theForm.getMyFile(); // ricaviamo il nome del file String fileName= file.getFileName(); // ricaviamo il MIME type del file String contentType = file.getContentType(); // ricaviamo le dimensioni del file (in Bytes) int sizeTemp = file.getFileSize(); String size = (sizeTemp + " Bytes"); // costruiamo una stringa che indicherà il percorso assoluto sul server nel quale // sarà salvato il file, ad // esempio C:\files\mioFile.txt String path = "C:\\files\\" + fileName; try { // ricaviamo i dati del file mediante un InputStream InputStream inStream = file.getInputStream(); FileOutputStream outStream = new FileOutputStream(path); // salviamo il file nel percorso specificato while (inStream.available()>0) { outStream.write(inStream.read()); } } catch (FileNotFoundException fnfe) { return null; } catch (IOException ioe) { return null; } // eliminiamo il file temporaneo che abbiamo creato file.destroy(); // mettiamo nella request i dati così da poterli ricavare dalla jsp request.setAttribute("text",text); request.setAttribute("path",path); request.setAttribute("contentType",contentType); request.setAttribute("size",size); // forwardiamo alla jsp mappata come "Success" nel file struts-config.xml return mapping.findForward("Success"); }catch(Exception e){e.printStackTrace();} return null; } } In questo esempio abbiamo scelto di salvare i dati nella request e forwardare ad un'altra jsp che li presentasse, ma avremmo potuto, ad esempio, inserire questi dati in un DataBase in modo tale da mantenere un elenco di tutti i file caricati sul server ed eventualmente consentirne il download.
|