anakin2hawk | Bonjour,
Je suis en train de réaliser une applet d'upload ftp et je souhaite afficher une barre de progression pendant l'upload des fichiers.
Je crée une classe principale qui dans la méthode init crée un bouton avec un actionlistener qui dès qu'il est enfoncé ouvre un jfile chooser. Une fois le fichier sélectionneé, je lance un swing worker dans une classe à part.
Le doinbackground de ce swing worker crée un socket et se connecte à un serveur ftp distant pour uploader le fichier. Le problème est que l'applet fonctionne très bien dans l'applet viewer de eclipse mais plante au moment de la connexion socket. Tout se passe bien jusqu'à ce que la connexion se fasse puis plus rien.
D'où peut venir ce problème.
Merci d'avance de votre réponse.
mon main:
Code :
- public void init(){
-
- this.setSize(300, 80);
- this.setBackground(Color.darkGray);
- //On centre le texte du JLabel et on écrit en bleu...
-
- //On ajoute nos composants
- this.getContentPane().setBackground(Color.GRAY);
- this.getContentPane().add(bouton, BorderLayout.SOUTH);
- //Et le tour est joué !
-
- // Lors de l'appui sur le bouton, on crée un Jfile chooser qui va permettre de choisir le fichier à uploader
- this.bouton.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent arg0) {
- // On crée un JFileChooser pour choisir le fichier à uploader
- chooser = new JFileChooser();// On ouvre une boite de sélection de fichiers
- chooser.setApproveButtonText("Uploader" );
- chooser.setDialogTitle("Uploader" ); //On change les noms de la boite de sélection
- chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//On permet de choisir des fichiers seulement
-
-
- try
- {
- if(chooser.showOpenDialog(chooser) == JFileChooser.APPROVE_OPTION) {//Si on a appuyé sur le bouton ok pour choisir le fichier
-
-
- try {
- File dir = new File(chooser.getSelectedFile().getAbsolutePath());//On crée un fichier à partir du chemin sélectionné dans le JFile Chooser
-
- boolean isDir = dir.isDirectory(); //On vérifie si ce fichier est un dossier (en l'occurence il ne l'est pas mais c'est pour une utilisation future de cet applet
- if (isDir)//Si c'est un dossier on l'upload
- {
- //ftp.uploadDirectory(chooser.getSelectedFile().getAbsolutePath());// On upload le dossier
-
-
- }
- else // si le fichier sélectionné est un fichier, on l'upload
- {
- FileInputStream in = new FileInputStream(chooser.getSelectedFile().getAbsolutePath());// On initialise les flux de données
- /*fttp.stor(chooser.getSelectedFile().getAbsolutePath(),in, chooser.getSelectedFile().getName());
-
- */uploadTaskbis tb= new uploadTaskbis(chooser.getSelectedFile().getAbsolutePath(),in, chooser.getSelectedFile().getName());
-
- /*ftp.uploadFile(chooser.getSelectedFile().getAbsolutePath(), chooser.getSelectedFile().getName());
- */
-
- }
-
-
- } catch (Exception ftpe) {
- JOptionPane poij = new JOptionPane();
- poij.showMessageDialog(null,ftpe.getMessage(), "Connexion interrompue", JOptionPane.ERROR_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi
- } finally {
- }
- }
- }
- catch(java.lang.IndexOutOfBoundsException p)
- {
- }
- catch(java.lang.NullPointerException p)
- {
- }
- }
- });
- }
|
Ma task swing worker :
Code :
- class Task extends SwingWorker<Void, Void> {
- /*
- * Main task. Executed in background thread.
- */
- @Override
- public Void doInBackground() { // Cette tache se connecte au serveur et éffectue l'upload de fichiers
-
- try
- {
-
-
-
- fttp=new SimpleFTP();
- [#FF0E00][/#FF0E00]fttp.connect(TestApplet.getSERVEUR(),21,TestApplet.getUSER(),TestApplet.getPASSWORD());
- fttp.bin();
- fttp.cwd("administrateur" );
- fttp.cwd("uploads" );
-
- Le programme ne semble plus rien faire à partir d'ici
- f = new File(filelocal);//on récupère la taille du fichier
- size = (int)f.length();
-
-
-
- SwingUtilities.invokeLater(new Runnable() //AFFICHER UNE NOTIFICATION D'ECHEC DANS l'EDT
- {
- public void run()
- {
-
- JU.addWindowListener(WL);//Permet de détecter si la fenêtre est fermée et arrêter ainsi le téléchargement en passant à false la variable uploadOk
- JU.setProgressMax(size);// on prépare la JProgressBar
- JU.setVisible(true);
- JU.setSizeUploaded("Télachargé : 0kB of "+ size /1000 +" kB" );
- JU.setTimeRemaining("Temps restant : 00:00:00 (à 0 Octets/s)" );
- JU.setTimeElapsed("Temps écoulé : 00:00:00" );
- JU.setInfoUpload("Upload de "+f.getName() + " (1 of 1)" );
-
- }
- });
-
- BufferedInputStream input = new BufferedInputStream(inputStream);
- fttp.sendLine("PASV" );
- String response = fttp.readLine();
- if (!response.startsWith("227 " )) {
- throw new IOException("SimpleFTP could not request passive mode: "
- + response);
- }
- String ip = null;
- int port = -1;
- int opening = response.indexOf('(');
- int closing = response.indexOf(')', opening + 1);
- if (closing > 0) {
- String dataLink = response.substring(opening + 1, closing);
- StringTokenizer tokenizer = new StringTokenizer(dataLink, "," );
-
- try {
- ip = tokenizer.nextToken() + "." + tokenizer.nextToken() + "."
- + tokenizer.nextToken() + "." + tokenizer.nextToken();
- port = Integer.parseInt(tokenizer.nextToken()) * 256
- + Integer.parseInt(tokenizer.nextToken());
- } catch (Exception e) {
- throw new IOException("SimpleFTP received bad data link information: "
- + response);
- }
- }
- fttp.sendLine("STOR " + filename);
- Socket dataSocket = new Socket(ip, port);
-
- response = fttp.readLine();
- if (!response.startsWith ("150 " )) {
- //if (!response.startsWith("150 " )) {
- throw new IOException("SimpleFTP was not allowed to send the file: "
- + response);
- }
- BufferedOutputStream output = new BufferedOutputStream(dataSocket
- .getOutputStream());
- byte[] buffer = new byte[BUFFER_SIZE];
- int bytesRead = 0;
- counter = 0;//Initialisation des variables d'évolution d'upload
- timeElapse = 0;
-
- while (uploadOk)
- {
- timed=System.currentTimeMillis();// on récupère la durée au début de la boucle
-
- bytesRead = input.read(buffer);
-
- if (bytesRead < 0) // Si il n'y a plus de données dans le flux de donnée on sort de la boucle
- break;
-
- counter += bytesRead;
-
-
- output.write(buffer, 0, bytesRead);//upload par buffering
-
- timef=System.currentTimeMillis();// on récupère la durée à la fin de la boucle et on fait la différence pour connaître le remps écoulé
-
-
-
- taille=bytesRead;
- dureeboucle=(double)((System.currentTimeMillis()-timed));
-
- SwingUtilities.invokeLater(new Runnable()//MIS A JOUR DE LA PROGRESS BAR DANS l'EDT
- {
- public void run()
- {
-
- tableauDuree[indiceDebit]=(double)dureeboucle/1000;
- dureeMoyen = (tableauDuree[0]+tableauDuree[1]+tableauDuree[2]+tableauDuree[3]+tableauDuree[4]+tableauDuree[5]+tableauDuree[6]+tableauDuree[7])/8;
-
- tableauDebit[indiceDebit]= (int)((double)taille/(dureeMoyen)/1024);
-
- indiceDebit++;
- debitMoyen=(tableauDebit[0]+tableauDebit[1]+tableauDebit[2]+tableauDebit[3]+tableauDebit[4]+tableauDebit[5]+tableauDebit[6]+tableauDebit[7])/8;
-
- JU.setProgressValue(counter);
- JU.setSizeUploaded("Télachargé : "+ counter/1000 +"kB of "+ size /1000 +"kB" );
- if(indiceDebit==8)
- { JU.setTimeRemaining("Temps restant : "+conversionmSHMS((int)((double)(size-counter)/(double)debitMoyen))+ " (à "+debitMoyen+"kB/s)" );
-
- indiceDebit=0;
- }
- }
- });
-
-
- timeElapse += (timef-timed);
- timef=System.currentTimeMillis();
-
- SwingUtilities.invokeLater(new Runnable() //METTRE A JOUR LE TEMPS ECOULE DANS l'EDT
- {
- public void run()
- {
- tempsecoule=conversionmSHMScS(timeElapse);
- JU.setTimeElapsed("Temps écoulé : "+ tempsecoule);
- JU.setTimeRemaining("Temps restant : "+conversionmSHMS((int)((double)(size-counter)/(double)debitMoyen))+ " (à "+debitMoyen+"kB/s)" );
-
- }
- });
-
- }
- output.flush();//on attend que le buffer soit vidé pour être sur d'avoir transféré toutes les données
- output.close();//On ferme les Buffered stream pour éviter d'écrire des choses par inadvertance dans les fichiers.
- input.close();
- fttp.disconnect();
- response = fttp.readLine();
-
- if(uploadOk==true)
- {
- SwingUtilities.invokeLater(new Runnable() //AFFICHER UNE NOTIFICATION DE FIN DE TELECHARGEMENT DANS l'EDT
- { public void run()
- {
- JU.setVisible(false);
- JOptionPane finconnection = new JOptionPane();
- finconnection.showMessageDialog(null,"Fin du téléchargement effectué\nFichier : "+f.getName()+"\nTéléchargé : "+size/1000+"kB\nDurée : "+tempsecoule+"(Min:Sec:cS)", "Upload terminé", JOptionPane.INFORMATION_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi
-
- }
- });
- }
- else
- {
- try {
- TestApplet.fttp.DELE(filename);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- JOptionPane finconnection = new JOptionPane();
- finconnection.showMessageDialog(null,"Téléchargement annulé\n\n Le fichier a été supprimé du serveur", "Annulation", JOptionPane.INFORMATION_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi
-
- uploadOk=true;
- }
- }
-
- catch (FTPConnectionClosedException g)
- {
- JU.dispose();
- JOptionPane finconnection = new JOptionPane();
- finconnection.showMessageDialog(null,"La connexion a été fermée. Réessayez ultérieurement", "Connexion terminée", JOptionPane.ERROR_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi
-
- }
- catch(java.net.SocketException m)
- {
- JU.dispose();
- JOptionPane finconnection = new JOptionPane();
- finconnection.showMessageDialog(null,"La connexion a été fermée. Réessayez ultérieurement", "Connexion terminée", JOptionPane.ERROR_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi
-
- }
- catch(java.net.UnknownHostException m)
- {
- JU.dispose();
- JOptionPane finconnection = new JOptionPane();
- finconnection.showMessageDialog(null,"Impossible de se connecter au serveur", "Connexion impossible", JOptionPane.ERROR_MESSAGE);// En cas de problème à la connexion, on affiche pourquoi
-
- }
- catch(IOException e)
- {
- e.printStackTrace();
- }
-
- finally
- {
-
- try {
- output.flush();
- output.close();
- input.close();
- fttp.disconnect();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
-
- }
-
- }
-
-
- return null;
-
-
- }
- /*
- * Executed in event dispatching thread
- */
- @Override
- public void done() {
- Toolkit.getDefaultToolkit().beep();
-
- }
- }
|
|