顯示進度的 java FTP上傳文件

ff6m 9年前發布 | 6K 次閱讀 Java FTP

java實現FTP上傳有2種方式,一種是org.apache.commons.net.ftp.FTPClient這個jar包,一種是sun.net.ftp.FtpClient。不知道為什么,在使用前一種方式時,在遇到大批量的上傳文件時總會拋出異常,我卻找不出原因,所以使用的是后者。sun的FtpClient就在自帶的system library中,如果程序找不到,Remove一下system library,再重新添加一次就好。
這邊我套用的是別人封裝好的方法進行上傳的,只不過稍加修改,再上傳之前計算了一下所選文件(夾)的總大小,然后單獨開了一個線程每隔一段時間計算總的上傳量,然后刷新swing界面UI。這邊直接貼上FtpClient封裝好后的類的代碼:
java實現FTP上傳有2種方式,一種是org.apache.commons.net.ftp.FTPClient這個jar包,一種是 sun.net.ftp.FtpClient。不知道為什么,在使用前一種方式時,在遇到大批量的上傳文件時總會拋出異常,我卻找不出原因,所以使用的是 后者。

sun的FtpClient就在自帶的system library中,如果程序找不到,Remove一下system,再重新添加一遍就好。

下面主要貼上封裝好的FtpUtils類的代碼:

    package com.fisee.ftp;

import java.io.DataInputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.OutputStream;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.StringTokenizer;  
import sun.net.TelnetInputStream;  
import sun.net.TelnetOutputStream;  
import sun.net.ftp.FtpClient;  

/** 
 * ftp上傳,下載 
 *  
 * @author why 2009-07-30 
 *  
 */  
public class FtpUtils {  

    private String ip = "";  

    private String username = "";  

    private String password = "";  

    private int port = -1;  

    private String path = "";  

    FtpClient ftpClient = null;  

    OutputStream os = null;  

    FileInputStream is = null;  

    public static long trans = 0;//已傳輸文件大小  
    public static long totalSize = 0;//文件總大小  

    public FtpUtils(String serverIP, int port, String username, String password) {  
        this.ip = serverIP;  
        this.username = username;  
        this.password = password;  
        this.port = port;  
        trans = 0;  
    }  

    /** 
     * 連接ftp服務器 
     *  
     * @throws IOException 
     */  
    public boolean connectServer() {  
        ftpClient = new FtpClient();  
        try {  
            if (this.port != -1) {  
                ftpClient.openServer(this.ip, this.port);  
            } else {  
                ftpClient.openServer(this.ip);  
            }  
            ftpClient.login(this.username, this.password);  
            if (this.path.length() != 0) {  
                ftpClient.cd(this.path);// path是ftp服務下主目錄的子目錄  
            }  
            ftpClient.binary();// 用2進制上傳、下載  
            System.out.println("已登錄到\"" + ftpClient.pwd() + "\"目錄");  
            return true;  
        } catch (IOException e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  

    /** 
     * 斷開與ftp服務器連接 
     *  
     * @throws IOException 
     */  
    public boolean closeServer() {  
        try {  
            if (is != null) {  
                is.close();  
            }  
            if (os != null) {  
                os.close();  
            }  
            if (ftpClient != null) {  
                ftpClient.closeServer();  
            }  
            System.out.println("已從服務器斷開");  
            return true;  
        } catch (IOException e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  

    /** 
     * 檢查文件夾在當前目錄下是否存在 
     *  
     * @param dir 
     * @return 
     */  
    private boolean isDirExist(String dir) {  
        String pwd = "";  
        try {  
            pwd = ftpClient.pwd();  
            ftpClient.cd(dir);  
            ftpClient.cd(pwd);  
        } catch (Exception e) {  
            return false;  
        }  
        return true;  
    }  

    /** 
     * 在當前目錄下創建文件夾 
     *  
     * @param dir 
     * @return 
     * @throws Exception 
     */  
    private boolean createDir(String dir) {  
        try {  
            ftpClient.ascii();  
            StringTokenizer s = new StringTokenizer(dir, "/"); // sign  
            s.countTokens();  
            String pathName = ftpClient.pwd();  
            while (s.hasMoreElements()) {  
                pathName = pathName + "/" + (String) s.nextElement();  
                try {  
                    ftpClient.sendServer("MKD " + pathName + "\r\n");  
                } catch (Exception e) {  
                    e = null;  
                    return false;  
                }  
                ftpClient.readServerResponse();  
            }  
            ftpClient.binary();  
            return true;  
        } catch (IOException e1) {  
            e1.printStackTrace();  
            return false;  
        }  
    }  

    /** 
     * ftp上傳 如果服務器段已存在名為filename的文件夾,該文件夾中與要上傳的文件夾中同名的文件將被替換 
     *  
     * @param filename 
     *            要上傳的文件(或文件夾)名 
     * @return 
     * @throws Exception 
     */  
    public boolean upload(String filename) {  
        String newname = "";  
        if (filename.indexOf("/") > -1) {  
            newname = filename.substring(filename.lastIndexOf("/") + 1);  
        } else {  
            newname = filename;  
        }  
        return upload(filename, newname);  
    }  

    /** 
     * ftp上傳 如果服務器段已存在名為newName的文件夾,該文件夾中與要上傳的文件夾中同名的文件將被替換 
     *  
     * @param fileName 
     *            要上傳的文件(或文件夾)名 
     * @param newName 
     *            服務器段要生成的文件(或文件夾)名 
     * @return 
     */  
    public boolean upload(String fileName, String newName) {  
        try {  
            /*String savefilename = new String(fileName.getBytes("ISO-8859-1"), 
                    "GBK");*/  
            String savefilename = fileName;  
            File file_in = new File(savefilename);// 打開本地待長傳的文件  
            if (!file_in.exists()) {  
                throw new Exception("此文件或文件夾[" + file_in.getName() + "]有誤或不存在!");  
            }  
            if (file_in.isDirectory()) {  
                upload(file_in.getPath(), newName, ftpClient.pwd());  
            } else {  
                uploadFile(file_in.getPath(), newName);  
            }  

            if (is != null) {  
                is.close();  
            }  
            if (os != null) {  
                os.close();  
            }  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            System.err.println("Exception e in Ftp upload(): " + e.toString());  
            return false;  
        } finally {  
            try {  
                if (is != null) {  
                    is.close();  
                }  
                if (os != null) {  
                    os.close();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  

    /** 
     * 真正用于上傳的方法 
     *  
     * @param fileName 
     * @param newName 
     * @param path 
     * @throws Exception 
     */  
    private void upload(String fileName, String newName, String path)  
            throws Exception {  
        //String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");  
        String savefilename = fileName;  
        File file_in = new File(savefilename);// 打開本地待長傳的文件  
        if (!file_in.exists()) {  
            throw new Exception("此文件或文件夾[" + file_in.getName() + "]有誤或不存在!");  
        }  
        if (file_in.isDirectory()) {  
            if (!isDirExist(newName)) {  
                createDir(newName);  
            }  
            ftpClient.cd(newName);  
            File sourceFile[] = file_in.listFiles();  
            for (int i = 0; i < sourceFile.length; i++) {  
                if (!sourceFile[i].exists()) {  
                    continue;  
                }  
                if (sourceFile[i].isDirectory()) {  
                    this.upload(sourceFile[i].getPath(),  
                            sourceFile[i].getName(), path + "/" + newName);  
                } else {  
                    this.uploadFile(sourceFile[i].getPath(),  
                            sourceFile[i].getName());  
                }  
            }  
        } else {  
            uploadFile(file_in.getPath(), newName);  
        }  
        ftpClient.cd(path);  
    }  

    /** 
     * upload 上傳文件 
     *  
     * @param filename 
     *            要上傳的文件名 
     * @param newname 
     *            上傳后的新文件名 
     * @return -1 文件不存在 >=0 成功上傳,返回文件的大小 
     * @throws Exception 
     */  
    public long uploadFile(String filename, String newname) throws Exception {  
        long result = 0;  
        TelnetOutputStream os = null;  
        FileInputStream is = null;  
        try {  
            java.io.File file_in = new java.io.File(filename);  
            if (!file_in.exists())  
                return -1;  
            os = ftpClient.put(newname);  
            result = file_in.length();  
            is = new FileInputStream(file_in);  
            byte[] bytes = new byte[1024];  
            int c;  
            while ((c = is.read(bytes)) != -1) {  
                os.write(bytes, 0, c);  
                trans = trans + c;            
            }  
        } finally {  
            if (is != null) {  
                is.close();  
            }  
            if (os != null) {  
                os.close();  
            }  
        }  
        return result;  
    }  

    /** 
     * 從ftp下載文件到本地 
     *  
     * @param filename 
     *            服務器上的文件名 
     * @param newfilename 
     *            本地生成的文件名 
     * @return 
     * @throws Exception 
     */  
    public long downloadFile(String filename, String newfilename) {  
        long result = 0;  
        TelnetInputStream is = null;  
        FileOutputStream os = null;  
        try {  
            is = ftpClient.get(filename);  
            java.io.File outfile = new java.io.File(newfilename);  
            os = new FileOutputStream(outfile);  
            byte[] bytes = new byte[1024];  
            int c;  
            while ((c = is.read(bytes)) != -1) {  
                os.write(bytes, 0, c);  
                result = result + c;  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                if (is != null) {  
                    is.close();  
                }  
                if (os != null) {  
                    os.close();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return result;  
    }  

    /** 
     * 取得相對于當前連接目錄的某個目錄下所有文件列表 
     *  
     * @param path 
     * @return 
     */  
    public List getFileList(String path) {  
        List list = new ArrayList();  
        DataInputStream dis;  
        try {  
            dis = new DataInputStream(ftpClient.nameList(this.path + path));  
            String filename = "";  
            while ((filename = dis.readLine()) != null) {  
                list.add(filename);  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return list;  
    }  

    public static void main(String[] args) {  
        FtpUtils ftp = new FtpUtils("192.168.1.100", 8833, "ScumVirus",  
                "123456");  
        ftp.connectServer();  
        boolean result = ftp.upload("E:/11game", "");  
        System.out.println(result ? "上傳成功!" : "上傳失敗!");  
        ftp.closeServer();  
        /** 
         * FTP遠程命令列表 USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT PASS PASV STOR 
         * REST CWD STAT RMD XCUP OPTS ACCT TYPE APPE RNFR XCWD HELP XRMD STOU 
         * AUTH REIN STRU SMNT RNTO LIST NOOP PWD SIZE PBSZ QUIT MODE SYST ABOR 
         * NLST MKD XPWD MDTM PROT 
         * 在服務器上執行命令,如果用sendServer來執行遠程命令(不能執行本地FTP命令)的話,所有FTP命令都要加上\r\n 
         * ftpclient.sendServer("XMKD /test/bb\r\n"); //執行服務器上的FTP命令 
         * ftpclient.readServerResponse一定要在sendServer后調用 
         * nameList("/test")獲取指目錄下的文件列表 XMKD建立目錄,當目錄存在的情況下再次創建目錄時報錯 XRMD刪除目錄 
         * DELE刪除文件 
         */  
    }  

}  </pre> 


刷新進度條線程:

    //刷新進度條線程
class ProgressThread extends Thread {
private JProgressBar progressBar;

    public ProgressThread(JProgressBar progressBar) {  
        this.progressBar = progressBar;  
    }  

    public void run() {  
        while (flag) {  
            int k = (int) (FtpUtils.trans * 100 / FtpUtils.totalSize);  
            progress.setValue(k);  
            try {  
                Thread.sleep(1000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}  </pre> 


界面效果圖

附上源碼:點擊下載

來自:http://blog.csdn.net/u013401219/article/details/46468349

 本文由用戶 ff6m 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!