2013-06-14 16 views
6

Ich entwickle ein Applet FTP-Upload von einer Webapp zu ermöglichen ...Apache Commons Net FtpClient abbrechen Dateispeicher

Der Sendevorgang funktioniert gut, aber ich möchte in der Lage wie eine Datei speichert in abzubrechen Fortschritt.

Ich bin nicht sehr fließend mit Threads. Mein erster Versuch war es, ftp.abort() im Cancel-Thread aufzurufen, aber die Methode abort wurde nur aufgerufen, wenn die storeFile-Methode beendet wurde, so als würde der Sende-Thread das ftp-Objekt sperren.

Also habe ich den Code geändert, um den Sende-Thread zu unterbrechen und es in der Kopie Stream Listener zu überprüfen. Die Dateispeicherung stoppt wie erwartet, aber der Aufruf von ftp.abort() hängt die Anwendung, sie wird nie abgeschlossen.

Irgendwelche Ideen?

Danke, Philip

Senden Betrieb:

botaoEnviar.setEnabled(false); 
    botaoCancelar.setEnabled(true); 
    textField.requestFocus(); 

    threadEnvio = new Thread(new Runnable() 
    { 
    @Override 
    public void run() 
    {    
     FileInputStream fis = null; 
     try 
     { 
      if(arquivoSelecionado == null) 
      { 
       throw new IllegalArgumentException("Arquivo deve ser informado"); 
      } 

      try 
      { 
       ftp = new FTPClient(); 
       ftp.connect("192.168.1.243"); 
      } 
      catch(Exception e) 
      { 
       throw new FtpConnectionException("Não foi possível conectar no servidor FTP", e); 
      } 

      if(!ftp.login("c001", "0AJF2J36")) 
      { 
       throw new IllegalArgumentException("Não foi possível autenticar no servidor FTP"); 
      } 

      ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 

      ftp.setCopyStreamListener(new CopyStreamAdapter() 
      {     
       @Override 
       public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) 
       { 
       if(threadEnvio.isInterrupted()) 
       { 
        try 
        { 
         ftp.abort();       
        } 
        catch(IOException ex) 
        { 
         handleException(ex); 
        } 
       } 
       else 
       { 
        int percent = (int) (totalBytesTransferred * 100/arquivoSelecionado.length()); 
        progressBar.setValue(percent); 
       } 
       } 
      }); 

      fis = new FileInputStream(arquivoSelecionado);    
      if(ftp.storeFile(arquivoSelecionado.getName(), fis)) 
      { 
       JOptionPane.showMessageDialog(null, "Arquivo enviado com suceso"); 
      } 
      else 
      { 
       JOptionPane.showMessageDialog(null, "Não foi possível enviar o arquivo", "Erro", JOptionPane.ERROR_MESSAGE); 
      } 

      ftp.logout(); 
     }    
     catch(Exception e) 
     { 
      handleException(e); 
     } 
     finally 
     { 
      if(fis != null) 
      { 
       try 
       { 
       fis.close(); 
       } 
       catch(IOException ex) 
       { 
       handleException(ex); 
       } 
      } 

      if(ftp != null) 
      { 
       try 
       { 
       ftp.disconnect(); 
       } 
       catch(IOException ex) 
       { 
       handleException(ex); 
       } 
      } 

      progressBar.setValue(0); 
      botaoEnviar.setEnabled(true);    
      botaoCancelar.setEnabled(false);    
     } 
    } 
    }); 
    threadEnvio.start(); 

Vorgang abbrechen:

botaoCancelar.setEnabled(false); 

    new Thread(new Runnable() 
    { 
    @Override 
    public void run() 
    { 
     try 
     {    
      threadEnvio.interrupt(); 
     } 
     catch(Exception ex) 
     { 
      handleException(ex); 
     } 
     finally 
     { 
      botaoCancelar.setEnabled(true);    
     } 
    } 

    }).start(); 
+0

Ja wäre nett, wenn commons net FTPClient API hatte, um eine Übertragung abzubrechen, zum Beispiel mit dem Kopie-Listener, wo Sie einen booleschen Wert als false zurückgeben können, um die Übertragung abzubrechen. –

+4

Anstatt zu denken, den Thread zu unterbrechen, versuchen Sie, den ftp = new FTPClient() zugänglich zu machen. Wenn der Benutzer auf die Schaltfläche Abbrechen klickt, fügen Sie dieser Schaltfläche ein Ereignis hinzu, das den FTP-Server abruft und die Methode [abor()] ausführt (http://commons.apache.org/proper/commons-net/javadocs/api- 3.3/org/apache/commons/net/ftp/ftp.html # abor()) auf der ftp-Instanz. – vianna77

Antwort

0

einen Thread wie diese Unterbrechung ist nicht wahr, und dazu führen, dass Wartethread für einige Sekunden (oder sogar Millis) bei genau der Linie, die co mpiler liest in Ihrem Thread
die einzige Möglichkeit, dass Sie Ihren FTP-Upload abbrechen kann einige Zeit Thread Schlaf macht und dann Upload abbrechen und schließlich für Thread warten selbst abzuschließen
sehen:

try { 
      try { 
        Thread.currentThread(); 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

      try { 
        mFTP.abort(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
    } catch (NetworkOnMainThreadException e) { 

    }