Ich entwickle ein Applet FTP-Upload von einer Webapp zu ermöglichen ...Apache Commons Net FtpClient abbrechen Dateispeicher
Der Sendevorgang funktioniert gut, aber ich möchte in der Lage wie eine Datei speichert in abzubrechen Fortschritt.
Ich bin nicht sehr fließend mit Threads. Mein erster Versuch war es, ftp.abort() im Cancel-Thread aufzurufen, aber die Methode abort wurde nur aufgerufen, wenn die storeFile-Methode beendet wurde, so als würde der Sende-Thread das ftp-Objekt sperren.
Also habe ich den Code geändert, um den Sende-Thread zu unterbrechen und es in der Kopie Stream Listener zu überprüfen. Die Dateispeicherung stoppt wie erwartet, aber der Aufruf von ftp.abort() hängt die Anwendung, sie wird nie abgeschlossen.
Irgendwelche Ideen?
Danke, Philip
Senden Betrieb:
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();
Vorgang abbrechen:
botaoCancelar.setEnabled(false);
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
threadEnvio.interrupt();
}
catch(Exception ex)
{
handleException(ex);
}
finally
{
botaoCancelar.setEnabled(true);
}
}
}).start();
Ja wäre nett, wenn commons net FTPClient API hatte, um eine Übertragung abzubrechen, zum Beispiel mit dem Kopie-Listener, wo Sie einen booleschen Wert als false zurückgeben können, um die Übertragung abzubrechen. –
Anstatt zu denken, den Thread zu unterbrechen, versuchen Sie, den ftp = new FTPClient() zugänglich zu machen. Wenn der Benutzer auf die Schaltfläche Abbrechen klickt, fügen Sie dieser Schaltfläche ein Ereignis hinzu, das den FTP-Server abruft und die Methode [abor()] ausführt (http://commons.apache.org/proper/commons-net/javadocs/api- 3.3/org/apache/commons/net/ftp/ftp.html # abor()) auf der ftp-Instanz. – vianna77