2013-06-14 11 views
6

dosya deposu iptal, ancak bir dosya içinde saklanması iptal edebilmek istiyorum ilerleme.Apache Commons Net FtpClient</p> <p>gönderme işlemi iyi çalışıyor ... Bir webapp FTP yükleme izin vermek için bir applet geliştiriyorum

Konuya çok akıcı değilim. İlk denemem ipucu ipinde ftp.abort() işlevini çağırmaktı, ancak iptal yöntemi yalnızca gönderim iş parçacığı ftp nesnesini kilitliyormuş gibi storeFile yöntemi bittiğinde çağrıldı.

Bu nedenle, ileti dizisini kesmek için kodu değiştirdim ve kopya akışı dinleyicisinde kontrol ettim. Dosya depolama beklendiği gibi durur, ancak ftp.abort() çağrısı uygulamayı kapatır, hiçbir zaman tamamlanmaz.

Herhangi bir fikrin var mı?

sayesinde Philip

gönderme işlemi:

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(); 

İptal işlemi:

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

: mpiler sizin dizisindeki size ftp yükleme iplik bir uyku biraz zaman yapıyor iptal ve sonra yüklemeyi iptal ve sonuçta kendisini
görüyoruz tamamlamak için iş parçacığı bekleyebilir
tek yolu okuyor commons net FTPClient'in aktarımı iptal etmek için API'ye sahip olsaydı, örneğin kopya dinleyiciyi kullanarak, transferi iptal etmek için false olarak bir boolean döndüğünüzde iyi olurdu. –

+4

İpliği kesintiye uğratmak yerine, ftp = yeni FTPClient() öğesine erişmeyi deneyin. Kullanıcı İptal düğmesine tıkladığında, bu düğüme ftp'yi alacak ve [abor()] yöntemini çalıştıracak bir etkinlik ekleyin (http://commons.apache.org/proper/commons-net/javadocs/api- Ftp örneğinde 3.3/org/apache/commons/net/ftp/FTP.html # abor()). – vianna77

cevap

0

böyle bir iş parçacığı kesintiye doğru değildir ve iplik beklemek neden tam olarak hangi satırda biraz sn (hatta millis) için Evet

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

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

    } 
İlgili konular