2013-06-14 4 views
6

파일 저장소를 중단,하지만 난 파일에 저장 취소 할 수 싶습니다 진행.아파치 코 몬즈 인터넷 FTPClient는</p> <p>가 전송 작업이 제대로 작동 ... 나는 웹 애플리케이션에서 FTP 업로드를 허용하는 애플릿을 개발하고 있어요

나는 스레드에 유창하지 않습니다. 나의 첫 번째 시도는 취소 스레드에서 ftp.abort()를 호출하는 것이었지만, send 스레드가 ftp 객체를 잠그고있는 것처럼 storeFile 메소드가 완료 될 때만 중단 메소드가 호출되었습니다.

그래서 코드를 전송 스레드를 인터럽트하고 복사본 스트림 수신기에서 확인하도록 변경했습니다. 파일 저장이 예상대로 멈추지 만 ftp.abort() 호출은 응용 프로그램을 정지 시키며 절대 완료하지 않습니다.

아이디어가 있으십니까?

감사합니다, 필립

보내기 작업 :

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

취소 작업 :

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는 스레드에 당신이 당신의 FTP 업로드가 스레드 수면 시간을 좀하고있다 중단 한 다음 업로드를 중단하고 결국 자체
이 볼 을 완료 스레드 기다릴 수
있는 유일한 방법을 읽고 commons net FTPClient가 transfer를 중단하기위한 API를 가지고 있다면 좋을 것입니다. 예를 들어 copy listener를 사용하면 전송을 중단하기 위해 false를 반환 할 수 있습니다. –

+4

스레드 인터럽트를 생각하지 말고 ftp = new FTPClient()에 액세스 할 수있게하십시오. 사용자가 취소 버튼을 클릭하면 해당 버튼에 이벤트를 추가하여 ftp를 가져오고 [abor()] 메소드를 실행합니다 (http://commons.apache.org/proper/commons-net/javadocs/api- 3.3/org/apache/commons/net/ftp/FTP.html # abor()). – vianna77

답변

0

이 같은 스레드를 중단 사실이 아니다 및 스레드 대기 원인 정확히 몇 줄 (또는 심지어 밀리 초) 동안 그래

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

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

    }