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