Show progress during FTP file upload in a java applet

后端 未结 3 1718
南旧
南旧 2020-12-07 06:09

OK so I have the uploader uploading files using the Java FTP, I would like to update the label and the progress bar. Label with the percent text, bar with the percent int va

相关标签:
3条回答
  • 2020-12-07 06:19

    You should implement the transfer logic in a SwingWorker, that way the UI will have the chance to present the progress.

    0 讨论(0)
  • 2020-12-07 06:20

    From the sounds of it (and lacking any evidence to the contree) it sounds like your processing a time consuming action in the Event Dispatching Thread

    You might like to read Concurrency in Swing for some further insight

    I'd suggest using a SwingWorker to perform the actual transfer & take advantage of its built in progress support

    UPDATE after seeing source code

    1. Don't mix heavy weight components with light weight components. Change Applet to JApplet, change TextField to JTextField, don't use Canvas use a JPanel or JComponent
    2. If you expect other people to read your code, please use proper names for your variables, I have no idea what p is.
    3. Your Thread is useless. Rather then starting the thread and using it's run method you simply make your download call within it's constructor. This will do nothing for you...

    Remove your implementation of MyThread and replace it with

    public class MyWorker extends SwingWorker<Object, Object> {
    
        private URL host;
        private File outputFile;
    
        public MyWorker(URL host, File f) {
            this.host = host;
            outputFile = f;
        }
    
        @Override
        protected Object doInBackground() throws Exception {
    
            // You're ignoring the host you past in to the constructor
            String hostName = "localhost";
            String username = "un";
            String password = "pass";
            String location = f.toString();
    
            //FTPClient ftp = null;
    
            ftp.connect(hostName, 2121);
            ftp.login(username, password);
    
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
    
            ftp.setKeepAlive(true);
            ftp.setControlKeepAliveTimeout(3000);
            ftp.setDataTimeout(3000); // 100 minutes
            ftp.setConnectTimeout(3000); // 100 minutes
    
            ftp.changeWorkingDirectory("/SSL");
    
            int reply = ftp.getReplyCode();
            System.out.println("Received Reply from FTP Connection:" + reply);
    
            if (FTPReply.isPositiveCompletion(reply)) {
                System.out.println("Connected Success");
            }
            System.out.println(f.getName().toString());
    
            File f1 = new File(location);
            in = new FileInputStream(f1);
    
            FileInputStream input = new FileInputStream(f1);
            // ftp.storeFile(f.getName().toString(),in);
    
            //ProgressMonitorInputStream is= new ProgressMonitorInputStream(getParent(), "st", in);
            OutputStream ftpOut = ftp.storeFileStream(f.getName().toString());
    
    
            System.out.println(ftpOut.toString());
            //newname hereSystem.out.println(ftp.remoteRetrieve(f.toString()));
            OutputStream output = new BufferedOutputStream(ftpOut);
            CopyStreamListener listener = new CopyStreamListener() {
                public void bytesTransferred(final long totalBytesTransferred, final int bytesTransferred, final long streamSize) {
    
                    setProgress((int) Math.round(((double) totalBytesTransferred / (double) streamSize) * 100d));
    
                }
    
                @Override
                public void bytesTransferred(CopyStreamEvent arg0) {
                    // TODO Auto-generated method stub
                }
            };
    
            Util.copyStream(input, output, ftp.getBufferSize(), f.length(), listener);
    
            return null;
    
        }
    }
    

    In your ActionListener of o (??) replace the thread execution code with

    try {
        MyWorker worker = new MyWorker(new URL("http://localhost"), file);
        worker.addPropertyChangeListener(new PropertyChangeListener() {
    
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals("progress")) {
                    Integer progress = (Integer) evt.getNewValue();
                    progressBar.setValue(progress);
                }
            }
        });
        worker.execute();
    } catch (MalformedURLException ex) {
        ex.printStackTrace();
    }
    

    Note. You are ignoring the URL you pass to the constructor. http:// is not ftp:// so I doubt this will work...

    0 讨论(0)
  • 2020-12-07 06:33

    During the upload you don't see changes to the GUI, because you run the upload and the GUI changes in the same thread. You should start one threayd that does the upload and another one in EDT (Event-Dispatch-Thread) that does the GUI updates.

    For more info see:

    1. The Event Dispatch Thread
    0 讨论(0)
提交回复
热议问题