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