Forum by laureateci.it
[ Home | REGOLE FORUM | Tutti i blog | Profilo | Registrati | CHAT | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download Informatica | Download ICD | Download TPS | Download Magistrale | Download Specialistica | Giochi | Cerca nel web | cerca | faq | RSS ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 Cultura Informatica
 Corso di java
 Servlet Upload Progress Bar

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista Inserisci Faccine
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Smilies
Approvazione [^] Arrabbiato [:(!] Bacio [:X] Bevuta [:273]
Caldo [8D] Compiaciuto [8)]    
compleanno [:269]
Davvero Felice [:D] Diavoletto [}:)] Disapprovazione [V] Domanda [?]
Felice [:)] Fumata [:29] Goloso [:P] Imbarazzato [:I]
Infelice [:(] Morte improvvisa da [:62]
Morto [xx(] Occhio Nero [B)] Occhiolino [;)] Palla 8 [8]
pc [:205]    
Riproduzione [:76]
Scioccato [:O]      

   Allega file
  Clicca qui per inserire la tua firma nel messaggio.
Clicca qui per sottoscrivere questa Discussione.
    

V I S U A L I Z Z A    D I S C U S S I O N E
comm64 Inserito il - 22/12/2008 : 16:44:16
Salve gente,
tramite degli esempi su internet sono riuscito a creare la mia servlet con relativa pagina JSP per l'upload di file. Vorrei sapere se fosse possibile includere una progress bar nella pagina di upload che mi indichi sullo stato della transazione.
Vi allego il mio codice:
SERVLET:
codice:

import com.oreilly.servlet.*;

//~--- JDK imports ------------------------------------------------------------

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class ControllerFiles extends HttpServlet
    {
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
        // Istanziamo le variabili
        // Il ServletContext sevirà per ricavare il MIME type del file uploadato
        ServletContext context = getServletContext();
        String         forw    = null;

        try
          {
            // Stabiliamo la grandezza massima del file che vogliamo uploadare
            int              maxUploadSize = 100000000;
            MultipartRequest multi         = new MultipartRequest(request, ".", maxUploadSize);
            String           descrizione   = multi.getParameter("text");
            File             myFile        = multi.getFile("myFile");
            String           filePath      = multi.getOriginalFileName("myFile");
            String           path          = "C:\files\";

            try
              {
                // ricaviamo i dati del file mediante un InputStream
                FileInputStream inStream = new FileInputStream(myFile);

                // stabiliamo dove andrà scritto il file
                FileOutputStream outStream = new FileOutputStream(path + myFile.getName());

                // salviamo il file nel percorso specificato
                while (inStream.available() > 0)
                    {
                    outStream.write(inStream.read());
                    }

                // chiudiamo gli stream
                inStream.close();
                outStream.close();
              }
            catch (FileNotFoundException fnfe)
              {
                fnfe.printStackTrace();
              }
            catch (IOException ioe)
              {
                ioe.printStackTrace();
              }

            forw = "/done.jsp";

            // mettiamo nella request i dati così da poterli ricavare dalla jsp
            request.setAttribute("contentType", context.getMimeType(path + myFile.getName()));
            request.setAttribute("text", descrizione);
            request.setAttribute("path", path + myFile.getName());
            request.setAttribute("size", Long.toString(myFile.length()) + " Bytes");

            RequestDispatcher rd = request.getRequestDispatcher(forw);

            rd.forward(request, response);
          }
        catch (Exception e)
          {
            e.printStackTrace();
          }
        }
    }



Pagina JSP
codice:


<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
   
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
 <form align="center" method="POST" action="ControllerFiles" 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">
                    <textarea name="text" cols="33" rows="2"></textarea>
            </td>
        </tr>
        <tr>
            <td align="center">File</td>
            <td>
                    <input name="myFile" type="file">
            </td>
            <td align="center">
                    <input type="submit" name="salva" value="SALVA">
            </td>
        </tr>
    </table>
</form>
 
 
</html>




WEB.XML DI TOMCAT
codice:

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">



 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

   <servlet>
    <servlet-name>ControllerFiles</servlet-name>
    <servlet-class>ControllerFiles</servlet-class>
  </servlet>
   <servlet-mapping>
    <servlet-name>ControllerFiles</servlet-name>
    <url-pattern>/ControllerFiles</url-pattern>
  </servlet-mapping>

</web-app>
11   U L T I M E    R I S P O S T E    (in alto le più recenti)
feeb Inserito il - 25/12/2008 : 00:45:56
http://www.raditha.com/megaupload/

Originally created to provide a progress bar support for file uploads with php, the project has grown to cover for JSP/Servlet based file uploads as well. Plans are afoot to release a Perl version of megaupload in the coming weeks.
comm64 Inserito il - 24/12/2008 : 12:13:46
Ho trovato anche questo suggerimento su un forum:
Hi,

One way is to override sendData from org.apache.commons.httpclient.methods.multipart.FilePart and add your custom code for monitoring and calculating progress file upload.

Regards,
Ivica

mo dovrei capire come metterlo in pratica
genius Inserito il - 24/12/2008 : 10:55:49
ho trovato questo, ma usa ftp :S
http://coding.derkeiler.com/Archive/Java/comp.lang.java.gui/2005-11/msg00045.html

cmq auguri anche a te ;)
comm64 Inserito il - 24/12/2008 : 10:39:17
Nel Frattempo, Buon Natale
genius Inserito il - 24/12/2008 : 09:34:48
si ora puoi sicuramente farlo, aggiungi la tua progress bar alla gui, devi strutturare un pò meglio il codice, ma in linea di massima puoi usare il metodo che ti ho descritto sopra.

Oggi per ovvie ragioni dubito di poter far + di questo, ma se posso e non sei ancora riuscito nel frattempo, nei prox giorni ti prometto che do uno sguardo + completo al codice, e magari vedo se riesco a darti una mano + concreta ;)

EDIT: ho visto che hai eliminato il ciclo in cui inviavi il file perchè stai usando HttpClient... forse ora è + difficile tenere traccia dei progressi, ma vedrò meglio ;)
comm64 Inserito il - 23/12/2008 : 21:10:42
E' Ufficiale.Sono riuscito a inviare un file alla mia servlet (per essere sinceri + di uno contemporaneamente.. upload multiplo.)
Allego il codice perchè mi piace condividere sperando di far cosa utile.
"Naturalmente non ho applicato le regole di Ingegneria del Software e tanti controlli che sono utili, quindi il codice non è strutturato come si deve ma basta per capire come fare."
Obiettivo: Fare l'upload di file da applicazione stand-alone o applet su server sfruttando la servlet.
La servlet è la stessa del post in alto..
Lato client invece:Applet (per provarla non usate il browser perchè deve essere firmata tramite certificato)Potete cmq inserire il codice in un Jframe


//~--- JDK imports ------------------------------------------------------------

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class UploadApplet extends javax.swing.JApplet {

    private File[]      fileScelti;
    private JButton     jBtbUpload;
    private JList       jList1;
    private JScrollPane jScrollPane1;
    private JButton     jUploadBtb;

    public UploadApplet() {

        super();
        initGUI();
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                JFrame       frame = new JFrame();
                UploadApplet inst  = new UploadApplet();

                frame.getContentPane().add(inst);
                ((JComponent) frame.getContentPane()).setPreferredSize(inst.getSize());
                frame.pack();
                frame.setVisible(true);
            }

        });
    }

    private void initGUI() {

        try
            {
            setSize(new Dimension(400, 300));
            getContentPane().setLayout(null);

            {
                jScrollPane1 = new JScrollPane();
                getContentPane().add(jScrollPane1);
                jScrollPane1.setBounds(27, 22, 273, 129);
                {}
            }

            {
                jUploadBtb = new JButton();
                getContentPane().add(jUploadBtb);
                jUploadBtb.setText("Apri");
                jUploadBtb.setBounds(319, 22, 46, 26);
                jUploadBtb.setFont(new java.awt.Font("Tahoma", 0, 8));
                jUploadBtb.addMouseListener(new MouseAdapter() {

                    public void mouseClicked(MouseEvent evt) {
                        jUploadBtbMouseClicked(evt);
                    }

                });
            }

            {
                jBtbUpload = new JButton();
                getContentPane().add(jBtbUpload);
                jBtbUpload.setText("Upload");
                jBtbUpload.setBounds(142, 194, 91, 34);
                jBtbUpload.addMouseListener(new MouseAdapter() {

                    public void mouseClicked(MouseEvent evt) {
                        jBtbUploadMouseClicked(evt);
                    }

                });
            }
            }
        catch (Exception e)
            {
            e.printStackTrace();
            }
    }

    private void jUploadBtbMouseClicked(MouseEvent evt) {

        JFileChooser chooser = new JFileChooser();

        chooser.setMultiSelectionEnabled(true);
        chooser.showOpenDialog(this);

        File[] files = chooser.getSelectedFiles();

        this.fileScelti = files;

        String elementi[] = new String[files.length];

        for (int i = 0; i < files.length; i++) {

            elementi[i] = files[i].getName();
            System.out.println(files[i].getPath());
        }

        jList1 = new JList(elementi);
        jScrollPane1.setViewportView(jList1);
        jList1.setPreferredSize(new java.awt.Dimension(486, 262));
    }

    private void jBtbUploadMouseClicked(MouseEvent evt) {

        String     url = "http://localhost:80/Massimo/ControllerFiles";
        HtppUpload up  = new HtppUpload();

        up.setURL(url);
        up.setTargetFile(fileScelti);
        up.UploadFile();
    }
}

Classe per l'upload

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.params.HttpMethodParams;

//~--- JDK imports ------------------------------------------------------------

import java.io.File;

public class HtppUpload {

    private String URL;
    private File[]   targetFile;



	public void UploadFile() {
for (int i=0; i<targetFile.length; i++)
{
        PostMethod filePost = new PostMethod(URL);

        filePost.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, false);

        try
            {
            Part[] parts = { new FilePart(targetFile[i].getName(), targetFile[i]) };

            filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));

            HttpClient client = new HttpClient();

            client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);

            int status = client.executeMethod(filePost);

            if (status == HttpStatus.SC_OK) {
                System.out.println("Upload complete, response= " + filePost.getResponseBodyAsString());
            } else {
                System.out.println("Upload failed, response=" + HttpStatus.getStatusText(status));
            }
            }
        catch (Exception ex)
            {
            System.out.println("ERROR: " + ex.getClass().getName() + " " + ex.getMessage());
            ex.printStackTrace();
            }
        finally
            {
            filePost.releaseConnection();
            }
        }
    }

    public String getURL() {
        return URL;
    }

    public void setURL(String url) {
        URL = url;
    }

    public File[] getTargetFile() {
		return targetFile;
	}

	public void setTargetFile(File[] targetFile) {
		this.targetFile = targetFile;
	}
}



Con questa applicazione si può fare l'upload multiplo selezionando una sola volta con ALT+File nella JFilechooser sorpassando quindi le limitazioni delle pagine jsp e html che vogliono per forza che si deve selezionare per ogni file.

Una domanda x genius: adesso potrei inserire la JprogressBar.. che ne pensi? devo solo capire come fare
comm64 Inserito il - 23/12/2008 : 19:36:21
Forse ce l'ho fatta:) usando le librerie apache commons Http

Sono in fase di sperimentazione
comm64 Inserito il - 23/12/2008 : 19:03:30
Praticamente creare una applicazione o Applet (che provvederò a creare un certificato sennò non mi funzionerà mai a causa delle limitazioni di sicurezza imposte), che sostituisca la pagina JSP nell'upload

Il problema è come sostituire quello che fa la pagina JSP in una classe java. Cioè inviare un file di tipo multipart/form-data alla servlet in questione, ipotizzando che si trovi su Htpp://localhost/Application/MiaServlet
genius Inserito il - 23/12/2008 : 18:55:02
quindi tu vuoi fare una cosa del genere:

pagina html + applet <- lato client
servlet <- lato server

e vorresti far comunicare questa cosa? A naso non mi sembra così difficile, che problemi hai con l'applet?

n.b. tieni sempre presente le limitazioni imposte alle applet
comm64 Inserito il - 22/12/2008 : 23:59:02
Ciao, stavo provando un'altra strada.. quella di creare un'applicazione client java swing che comunicasse con la servlet in modo tale da poter inserire la bella JprogressBar e mi sono esaurito senza raggiungere un risultato. La Documentazione è sempre poca e sempre in Inglese.
Sembra quasi che certe cose siano segrete in ambito Java. Ho trovato solo librerie a pagamento ...
Quasi quasi ci rinuncio.. (causa esaurimento nervoso)

Ciao A tutti
genius Inserito il - 22/12/2008 : 23:28:42
non ho mai fatto una cosa del genere, di jsp non ne so molto (pbolo intervieni plz) ma se fosse possibile inserire graficamente un oggetto JProgressBar all'interno di una jsp, bè non ti resterebbe che fare banalmente una cosa del genere:


                ...
                int max = inStream.available();
                nomeBarra.setMaximum(max); // numero di byte totali
                nomeBarra.setValue(0); // numero di byte letti
                while (inStream.available() > 0)
                    {
                    outStream.write(inStream.read());
                    nomeBarra.setValue(max - inStream.available()); // totali - ancora_da_leggere = quelli letti
                                                                    // volendo puoi fare in percentuale dividento per 100
                                                                    // ovviamente troncando o arrotondando.
                    }
                ...


Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,09 secondi.

TargatoNA.it | SuperDeejay.Net | Antidoto.org | Brutto.it | Equiweb.it | Snitz Forum 2000