当前位置: 首页 > 面试题库 >

在Java小程序中上传FTP文件期间显示进度

米丰
2023-03-14
问题内容

好的,这样我就可以使用Java
FTP上传文件,我想更新标签和进度条。用百分比文本标签,用百分比int值标记。现在,使用当前代码,在上传结束时只能获得100和完整条。在上传过程中,它们均未更改。

这里是:

    OutputStream output = new BufferedOutputStream(ftpOut);
    CopyStreamListener listener = new CopyStreamListener() {
        public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {
            System.out.printf("\r%-30S: %d / %d", "Sent", totalBytesTransferred, streamSize);
            ftpup.this.upd(totalBytesTransferred,streamSize);
        }
        public void bytesTransferred(CopyStreamEvent arg0) { }
    };

    Util.copyStream(input, output, ftp.getBufferSize(), f.length(), listener);      
}

public void upd(long num, long size){
    int k = (int) ((num*100)/size);
    System.out.println(String.valueOf(k));
    this.d.setText(String.valueOf(k));
    //d.setText(String.valueOf(k));
    progressBar.setValue(k);
}

问题答案:

从它的声音(并且没有任何证据可以证明主观)看来,您在事件调度线程中处理一个耗时的动作

您可能想阅读Swing中的并发性以获得更多了解

我建议使用SwingWorker进行实际的传输并利用其内置的进度支持

看到源代码后进行更新

  1. 不要将重组分与轻组分混合。更改AppletJApplet,更改TextFieldJTextField,请勿Canvas使用a JPanelJComponent
  2. 如果您希望其他人阅读您的代码,请为变量使用专有名称,我不知道它是什么p
  3. Thread没用。而不是启动线程并使用它的run方法,您只需在它的构造函数中进行下载调用。这对您无济于事…

移除您的实作,MyThread并以取代

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;

    }
}

在您ActionListenero(??)中,将线程执行代码替换为

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();
}

注意。您将忽略传递给构造函数的URL。http://不是ftp://,所以我怀疑这是否有效…



 类似资料:
  • 我想将文件从一台服务器上传到另一台FTP服务器,以下是我的上传文件代码,但它抛出错误为: 远程服务器返回错误:(550)文件不可用(例如,找不到文件,无法访问)。 这是我的代码: 你能告诉我哪里出了问题吗?

  • 本文向大家介绍Python ftp上传文件,包括了Python ftp上传文件的使用技巧和注意事项,需要的朋友参考一下 以下代码比较简单,对python实现ftp上传文件相关知识感兴趣的朋友可以参考下 下面给大家介绍python实现ftp上传下载文件的方法 python本身自带一个FTP模块,可以实现上传下载的函数功能。

  • 问题内容: 当我尝试使用apache commons ftpClient和以下代码上传简单的文本文件时: 在FTP服务器的根目录中创建了一个文件,但该文件为空。怎么了?我已经尝试在上传PDF文件时将ftp模式更改为BINARY。但文件的大小也为0。 我也只想上传一堆txt文件,所以默认的ascii模式应该可以,对吧? 问题答案: 好的,看来这是我的防火墙的探针。当我停用防火墙时,文件将毫无问题地写

  • 长期搜索者,第一次问堆栈溢出的问题。我似乎总是能通过搜索找到我的答案,除了这次:) 我是Java编程的初学者。虽然我认为使用apache Commons ftp的小程序是在我的网站上实现FTP文件上传解决方案的最佳解决方案。 当我的所有代码都在init()方法中时,我就能够传输文件了。 不过,当我将代码移动到另一个方法(在javascript中调用)时,它在打印工作目录(PWD)后失败。 该代码适

  • 本文向大家介绍原生JS上传大文件显示进度条 php上传文件代码,包括了原生JS上传大文件显示进度条 php上传文件代码的使用技巧和注意事项,需要的朋友参考一下 JS原生上传大文件显示进度条,php上传文件,供大家参考,具体内容如下 在php.ini修改需要的大小: upload_max_filesize = 8M    post_max_size = 10M    memory_limit = 2

  • 问题内容: 我有上传表格,允许用户上传多个文件。我决定,如果文件很大,则进度条会很好。下面是我的源代码。我是jQuery的新手,通常我只会使用php,但是我发现ajax更加用户友好。 图像上传正常,数组发送到ajax,但进度条不动。实际上,调用这两个函数的console.log都不会产生这种情况。有没有正确的方法来调用我的ajax请求中的函数,以使此进度条正常工作。 beforeSubmit:be