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();
Ừ 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. –
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