I am developing an applet for downloading FTP from a web application ...
The send operation works fine, but I would like to cancel saving the file.
I am not very fluent about streams. My first attempt was to call ftp.abort () on the cancel thread, but the abort method was only called when the storeFile method completed, for example, if the send stream blocked the ftp object.
So, I changed the code to interrupt the send stream and check it in the copy stream listener. Saving the file stops as expected, but the ftp.abort () call hangs with the application, it never ends.
Any ideas?
Thanks Philip
Send operation:
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();
Cancel operation:
botaoCancelar.setEnabled(false); new Thread(new Runnable() { @Override public void run() { try { threadEnvio.interrupt(); } catch(Exception ex) { handleException(ex); } finally { botaoCancelar.setEnabled(true); } } }).start();
source share