package ftp; import java.io.File; import java.io.FileInputStream; import javax.swing.JOptionPane; import javax.swing.SwingWorker; import org.apache.log4j.Logger; import models.Image; /** * Executes the file upload in a background thread and updates progress to * listeners that implement the java.beans.PropertyChangeListener interface. * * @author www.codejava.net * */ public class UploadTask extends SwingWorker { /** * Logger instance for this class. */ private final static Logger LOGGER = Logger.getLogger(UploadTask.class); // 8MB buffer private static final int BUFFER_SIZE = 8 * 1024 * 1024;; private String host; private int port; private String username; private String password; private String destDir; private File uploadFile; private int percentCompleted; public UploadTask(String host, int port, String username, String password, String destDir, File uploadFile) { this.host = host; this.port = port; this.username = username; this.password = password; this.destDir = destDir; this.uploadFile = uploadFile; } /** * Executed in background thread */ @Override protected Void doInBackground() throws Exception { FTPUtility util = new FTPUtility(host, port, username, password); try { util.connect(); util.uploadFile(uploadFile, destDir); FileInputStream inputStream = new FileInputStream(uploadFile); byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead = -1; int i = 0; long totalBytesRead = 0; percentCompleted = 0; long fileSize = uploadFile.length(); Image.image.setFilesize(fileSize); long start = System.nanoTime(); final double NANOS_PER_SECOND = 1000000000.0; final double BYTES_PER_MIB = 1024 * 1024; while ((bytesRead = inputStream.read(buffer)) != -1 && isCancelled() == false) { util.writeFileBytes(buffer, 0, bytesRead); totalBytesRead += bytesRead; percentCompleted = (int) (totalBytesRead * 100 / fileSize); double speed = NANOS_PER_SECOND / BYTES_PER_MIB * totalBytesRead / (System.nanoTime() - start + 1); setProgress(percentCompleted); firePropertyChange("speed", 0, speed); firePropertyChange("filesize", 0, fileSize); firePropertyChange("bytesread", 0, totalBytesRead); } inputStream.close(); util.finish(); } catch (FTPException ex) { JOptionPane.showMessageDialog(null, "Error uploading file: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); ex.printStackTrace(); setProgress(0); cancel(true); } finally { util.disconnect(); } return null; } /** * Executed in Swing's event dispatching thread */ @Override protected void done() { if (!isCancelled() && percentCompleted==100) { LOGGER.info("Datei erfolgreich hochgeladen."); JOptionPane.showMessageDialog(null, "Datei erfolgreich hochgeladen.", "Message", JOptionPane.INFORMATION_MESSAGE); } else if(!isCancelled() && percentCompleted != 100){ LOGGER.error("Datei wurde unvollständig hochgeladen."); JOptionPane.showMessageDialog(null, "Datei wurde unvollständig hochgeladen. Bitte wiederholen.", "Message", JOptionPane.INFORMATION_MESSAGE); } } }