Zajmuję aplet aby umożliwić przesyłanie FTP z webapp ...Apache Commons Net FTPClient przerwać File Store
Operacja wyślij działa poprawnie, ale chciałbym móc anulować plikiem przechowującym w postęp.
Nie jestem biegły w obsłudze wątków. Pierwszą próbą było wywołanie ftp.abort() w wątku anulowania, ale metoda abort została wywołana dopiero po zakończeniu metody storeFile, tak jak w przypadku, gdy wątek wysyłania blokował obiekt ftp.
Zmieniłem kod, aby przerwać wysyłanie wątku i sprawdzić go w odbiorniku strumienia kopii. Przechowywanie plików zatrzymuje się zgodnie z oczekiwaniami, ale wywołanie ftp.abort() zawiesza aplikację, nigdy nie jest kompletne.
Wszelkie pomysły?
Dzięki Philip
Wysłać operacja:
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();
Anuluj Operacja:
botaoCancelar.setEnabled(false);
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
threadEnvio.interrupt();
}
catch(Exception ex)
{
handleException(ex);
}
finally
{
botaoCancelar.setEnabled(true);
}
}
}).start();
Tak Byłoby miło, gdyby sieć FTP FTPClient miał API, aby przerwać transfer, na przykład za pomocą słuchacza do kopiowania, gdzie można zwrócić wartość boolean jako false, aby przerwać transfer. –
Zamiast myśleć w kategoriach przerywania wątku, spróbuj uczynić ftp = new FTPClient() dostępnym. Kiedy użytkownik kliknie przycisk Anuluj, dodaj zdarzenie do przycisku, który dostanie ftp i uruchom metodę [abor()] (http://commons.apache.org/proper/commons-net/javadocs/api- 3.3/org/apache/commons/net/ftp/FTP.html # abor()) w instancji ftp. – vianna77