2013-06-14 12 views
6

Tôi đang phát triển một applet để cho phép tải lên FTP từ webapp ...Apache Commons Net FTPClient hủy bỏ lưu trữ tệp

Thao tác gửi hoạt động tốt, nhưng tôi muốn có thể hủy lưu trữ tệp phát triển.

Tôi không thông thạo các chủ đề. Nỗ lực đầu tiên của tôi là gọi ftp.abort() trong chủ đề hủy, nhưng phương thức hủy bỏ chỉ được gọi khi phương thức storeFile hoàn thành, giống như nếu chuỗi gửi đang khóa đối tượng ftp.

Vì vậy, tôi đã thay đổi mã để làm gián đoạn chuỗi gửi và kiểm tra nó trong trình nghe luồng sao chép. Các tập tin lưu trữ dừng lại như mong đợi, nhưng ftp.abort() gọi treo ứng dụng, nó không bao giờ hoàn thành.

Bất kỳ ý tưởng nào?

Cảm ơn, Philip

Gửi hoạt động:

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

Hủy bỏ hoạt động:

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

Ừ sẽ được tốt đẹp nếu commons net FTPClient có API để hủy bỏ một chuyển giao, ví dụ bằng cách sử dụng người nghe bản sao, nơi bạn có thể trả về một boolean là sai để hủy bỏ việc chuyển giao. –

+4

Thay vì suy nghĩ về cách ngắt chuỗi, hãy thử làm cho ftp = new FTPClient() có thể truy cập được. Khi người dùng nhấp vào nút Hủy, thêm một sự kiện vào nút đó sẽ nhận được ftp và chạy phương thức [abor()] (http://commons.apache.org/proper/commons-net/javadocs/api- 3.3/org/apache/commons/net/ftp/FTP.html # abor()) trên cá thể ftp. – vianna77

Trả lời

0

làm gián đoạn một sợi như thế này là không đúng sự thật và gây chờ đợi chủ đề của bạn trong vài giây (hoặc thậm chí là millis) ở chính xác đường nào mpiler được đọc trong chủ đề của bạn
cách duy nhất mà bạn có thể hủy bỏ upload ftp của bạn đang thực hiện chủ đề giấc ngủ một thời gian và sau đó hủy bỏ tải lên của bạn và sau khi tất cả chờ cho thread để hoàn thành bản thân
thấy điều này:

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

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

    }