现在的位置: 首页 > 综合 > 正文

java中FTP下载文件

2018年04月19日 ⁄ 综合 ⁄ 共 4269字 ⁄ 字号 评论关闭

一、下载所需要的jar包

http://commons.apache.org/net/download_net.cgi

二、编码实现

这里没有用到filter,如果用filter就可以过滤想要的文件。

public class Ftp {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Ftp ftp = new Ftp();
        String hostname = "www.strawberry.com";
        Integer port = 21;
        String username = "username";
        String password = "password";
        String remote = "/c.txt";
        String local = "/home/tin/LeonChen/FTP/";
        try {
            ftp.connect(hostname, port, username, password);
            System.out.println("接收状态:"+ftp.download(remote, local));
            ftp.disconnect();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private FTPClient ftpClient = new FTPClient();

    /*
     * * 连接到FTP服务器  
     * * @param hostname 主机名  
     * * @param port 端口  
     * * @param username 用户名  
     * * @param password 密码  
     * * @return 是否连接成功
     * * @throws IOException
     */
    private boolean connect(String hostname, int port, String username,
            String password) throws IOException {
        ftpClient.connect(hostname, port);
        ftpClient.setControlEncoding("UTF-8");
        if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            if (ftpClient.login(username, password)) {
                return true;
            }
        }
        disconnect();
        return false;
    }

    /*
     * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报
     *
     * @param remote 远程文件路径
     *
     * @param local 本地文件路径
     *
     * @return 上传的状态
     *
     * @throws IOException
     */
    public DownloadStatus download(String remote, String local)
            throws IOException {
        // 设置被动模式
        ftpClient.enterLocalPassiveMode();
        // 设置以二进制方式传输
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        DownloadStatus result;
        // 检查远程文件是否存在
        FTPFile[] files = ftpClient.listFiles(new String(remote
                .getBytes("UTF-8"), "iso-8859-1"));
        if (files.length != 1) {
            System.out.println("远程文件不存在");
            return DownloadStatus.Remote_File_Noexist;
        }
        long lRemoteSize = files[0].getSize();
        String fildName = files[0].getName();
        // 本地存在文件,进行断点下载
        File f = new File(local+fildName);
        if (f.exists()) {
            long localSize = f.length();
            if (localSize >= lRemoteSize) {
                System.out.println("本地文件大于远程文件,下载中止");
                return DownloadStatus.Local_Bigger_Remote;
            }

            // 进行断点续传,并记录状态
            FileOutputStream out = new FileOutputStream(f, true);
            ftpClient.setRestartOffset(localSize);
            InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("UTF-8"), "iso-8859-1"));
            byte[] bytes = new byte[1024];
            long step = lRemoteSize / 100;
            long process = localSize / step;
            int c;
            while ((c = in.read(bytes)) != -1) {
                out.write(bytes, 0, c);
                localSize += c;
                long nowProcess = localSize / step;
                if (nowProcess > process) {
                    process = nowProcess;
                    if (process % 10 == 0)
                        System.out.println("下载进度:" + process);
                    // TODO 更新文件下载进度,值存放在process变量中
                }
            }
            in.close();
            out.close();
            boolean isDo = ftpClient.completePendingCommand();
            if (isDo) {
                result = DownloadStatus.Download_From_Break_Success;
            } else {
                result = DownloadStatus.Download_From_Break_Failed;
            }
        } else {
            OutputStream out = new FileOutputStream(f);
            InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("UTF-8"), "iso-8859-1"));
            byte[] bytes = new byte[1024];
            long step = lRemoteSize / 100;
            long process = 0;
            long localSize = 0L;
            int c;
            while ((c = in.read(bytes)) != -1) {
                out.write(bytes, 0, c);
                localSize += c;
                long nowProcess = localSize / step;
                if (nowProcess > process) {
                    process = nowProcess;
                    if (process % 10 == 0)
                        System.out.println("下载进度:" + process);
                    // TODO 更新文件下载进度,值存放在process变量中
                }
            }
            in.close();
            out.close();
            boolean upNewStatus = ftpClient.completePendingCommand();
            if (upNewStatus) {
                result = DownloadStatus.Download_New_Success;
            } else {
                result = DownloadStatus.Download_New_Failed;
            }
        }
        return result;
    }

    private void disconnect() throws IOException {
        if (ftpClient.isConnected()) {
            ftpClient.disconnect();
        }
    }

}

【上篇】
【下篇】

抱歉!评论已关闭.