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); private static final int BUFFER_SIZE = 1024 * 1024; private static final double UPDATE_INTERVAL_SECONDS = 0.6; private static final double UPDATE_INTERVAL_MS = UPDATE_INTERVAL_SECONDS * 1000; private static final double BYTES_PER_MIB = 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); // show filesize in the GUI long fileSize = uploadFile.length(); Image.Filesize = fileSize; firePropertyChange("filesize", 0, fileSize); // prepare input stream FileInputStream inputStream = new FileInputStream(uploadFile); // initialize the counters needed for speed calculations percentCompleted = 0; byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead = -1; long totalBytesRead = 0; long lastUpdate = 0; long lastBytes = 0; long currentBytes = 0; while ((bytesRead = inputStream.read(buffer)) != -1 && !isCancelled()) { util.writeFileBytes(buffer, 0, bytesRead); currentBytes += bytesRead; totalBytesRead += bytesRead; long now = System.currentTimeMillis(); if (lastUpdate + UPDATE_INTERVAL_MS < now) { percentCompleted = (int) ((totalBytesRead * 100) / fileSize); setProgress(percentCompleted); lastBytes = (lastBytes * 2 + currentBytes) / 3; final double speed = lastBytes / UPDATE_INTERVAL_SECONDS; firePropertyChange("speed", 0, speed / BYTES_PER_MIB); firePropertyChange("bytesread", 0, totalBytesRead); lastUpdate = now; currentBytes = 0; } } // finalize the upload by updating the progress bar one last time // (in case we didn't get to do it because of the time interval) percentCompleted = (int) ((totalBytesRead * 100) / fileSize); setProgress(percentCompleted); 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); } } }