ftp上傳和下載文件的java實現

最近一個項目需要去ftp上下載文件,遇到一個問題是沒有用戶名和密碼,後來才發現ftp原來可以匿名登錄,而且還要聲明一下自己是匿名的,空字符串都登陸不上去的,一下是我的代碼,是匿名登錄的。

  1. package ftp2;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.OutputStream;  
  8. import java.net.SocketException;  
  9.   
  10. import org.apache.commons.io.FileUtils;  
  11. import org.apache.commons.io.IOUtils;  
  12. import org.apache.commons.net.ftp.FTPClient;  
  13. import org.apache.commons.net.ftp.FTPClientConfig;  
  14. import org.apache.commons.net.ftp.FTPFile;  
  15. import org.apache.commons.net.ftp.FTPReply;  
  16.   
  17. /** 
  18.  * 使用commons的net包進行ftp鏈接. 相關包:commons-net-1.4.1.jar ; 
  19.  * commons-io-1.2.jar;jakarta-oro-2.0.8.jar測試通過.可以列出ftp上的文件 
  20.  * 通過把ftp服務器上的文件流連接到outSteam及可以把文件下載到本機的目錄..限制如果目錄爲中文則需要處理.最好使用英文文件名 
  21.  *  
  22.  */  
  23. public class ListFtpFile {  
  24.   
  25.     private FTPClient ftpClient = new FTPClient();  
  26.   
  27.     private OutputStream outSteam = null;  
  28.   
  29.     /** 
  30.      * ftp服務器地址 
  31.      */  
  32.     private String hostName = "192.168.0.2";  
  33.     private int port = 212;  
  34.   
  35.     /** 
  36.      * 登錄名 
  37.      */  
  38.     private String userName = "anonymous";//匿名登錄,空字符串不行   
  39.   
  40.     /** 
  41.      * 登錄密碼 
  42.      */  
  43.     private String password = "[email protected]";//隨便一個地址,我胡亂寫一個也可以運行的   
  44.   
  45.     /** 
  46.      * 需要訪問的遠程目錄 
  47.      */  
  48.     private String remoteDir = "/software/dreamweaver/";  
  49.   
  50.     /** 
  51.      * 下載 
  52.      */  
  53.     private void download() {  
  54.         try {  
  55.             // 鏈接到ftp服務器   
  56.             ftpClient.connect(hostName,port);  
  57.             System.out.println("連接到ftp服務器:" + hostName + " 成功..開始登錄");  
  58.             // 登錄.用戶名 密碼   
  59.             boolean b = ftpClient.login(userName, password);  
  60.             System.out.println("登錄成功." + b);  
  61.               
  62. //          檢測連接是否成功   
  63.             int reply = ftpClient.getReplyCode();  
  64.             if(!FTPReply.isPositiveCompletion(reply)) {  
  65.                 ftpClient.disconnect();  
  66.                 System.err.println("FTP server refused connection.");  
  67.                 System.exit(1);  
  68.             }  
  69.               
  70.             ftpClient.setControlEncoding("GBK");  
  71.             FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);    
  72.             conf.setServerLanguageCode("zh");   
  73.             FTPFile[] remoteFiles = ftpClient.listFiles(remoteDir);  
  74.             if (remoteFiles != null) {  
  75.                 for (int i = 0; i < remoteFiles.length; i++) {  
  76.                     String name = remoteFiles[i].getName();  
  77.                       
  78.                     //下載   
  79.                     File localFile = new File("c:/001/ftp/" + name);  
  80.                     OutputStream is = new FileOutputStream(localFile);  
  81.                     //retrieveFile的第一個參數需要是 ISO-8859-1 編碼,並且必須是完整路徑!   
  82.                     String fileName = remoteDir + name;  
  83.                     ftpClient.retrieveFile(new String(fileName.getBytes("GBK"),"ISO-8859-1"), is);  
  84.                     is.close();  
  85.                       
  86.                     //打印   
  87.                     long length = remoteFiles[i].getSize();  
  88.                     String readableLength = FileUtils.byteCountToDisplaySize(length);  
  89.                     System.out.println(name + ":\t"+remoteFiles[i].isFile()+"\t" + readableLength);  
  90.                       
  91.                 }  
  92.             }  
  93.               
  94.   
  95.             ftpClient.logout();  
  96.         } catch (Exception e) {  
  97.             e.printStackTrace();  
  98.         } finally {  
  99.             IOUtils.closeQuietly(outSteam);  
  100.             try {  
  101.                 ftpClient.disconnect();  
  102.             } catch (IOException ioe) {  
  103.                 ioe.printStackTrace();  
  104.             }  
  105.         }  
  106.     }  
  107.       
  108.     /** 
  109.      * 上傳 
  110.      * */  
  111.     public void upload(){  
  112.         String srcUrl = "C:/001/菜單權限設計.doc";  
  113.         String targetFileName = "菜單權限設計.doc";  
  114.         try {  
  115.             ftpClient.connect(hostName,port);  
  116.             boolean b = ftpClient.login(userName, password);  
  117.             // 檢測連接是否成功   
  118.             int reply = ftpClient.getReplyCode();  
  119.             if (!FTPReply.isPositiveCompletion(reply)) {  
  120.                 ftpClient.disconnect();  
  121.                 System.err.println("FTP server refused connection.");  
  122.                 System.exit(1);  
  123.             }  
  124.               
  125.             ftpClient.setControlEncoding("GBK");  
  126.             FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);    
  127.             conf.setServerLanguageCode("zh");   
  128.               
  129.             File srcFile = new File(srcUrl);  
  130.             FileInputStream fis = null;  
  131.             fis = new FileInputStream(srcFile);  
  132.   
  133.             // 設置上傳目錄   
  134.             ftpClient.changeWorkingDirectory(remoteDir);  
  135.             ftpClient.setBufferSize(1024);  
  136.             ftpClient.setControlEncoding("GBK");  
  137.   
  138.             // 設置文件類型(二進制)   
  139.             ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
  140.             // 上傳   
  141.             b = ftpClient.storeFile(targetFileName, fis);  
  142.             IOUtils.closeQuietly(fis);  
  143.               
  144.             /*boolean bool = ftpClient.changeWorkingDirectory("/NC"); 
  145.             System.out.println("changeWorkingDirectory="+bool); 
  146.             bool = ftpClient.makeDirectory("/NC"); 
  147.             System.out.println("makeDirectory="+bool);*/  
  148.               
  149.             ftpClient.logout();  
  150.         } catch (SocketException e) {  
  151.             e.printStackTrace();  
  152.         } catch (IOException e) {  
  153.             e.printStackTrace();  
  154.         }finally{  
  155.             try {  
  156.                 ftpClient.disconnect();  
  157.             } catch (IOException e) {  
  158.                 e.printStackTrace();  
  159.             }  
  160.         }  
  161.           
  162.     }  
  163.   
  164.     /** 
  165.      * 測試 
  166.      * */  
  167.     public static void main(String[] args) {  
  168.         ListFtpFile listFtpfiles = new ListFtpFile();  
  169.         listFtpfiles.download();  
  170.         listFtpfiles.upload();  
  171.     }  
  172. }  
package ftp2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

/**
 * 使用commons的net包進行ftp鏈接. 相關包:commons-net-1.4.1.jar ;
 * commons-io-1.2.jar;jakarta-oro-2.0.8.jar測試通過.可以列出ftp上的文件
 * 通過把ftp服務器上的文件流連接到outSteam及可以把文件下載到本機的目錄..限制如果目錄爲中文則需要處理.最好使用英文文件名
 * 
 */
public class ListFtpFile {

	private FTPClient ftpClient = new FTPClient();

	private OutputStream outSteam = null;

	/**
	 * ftp服務器地址
	 */
	private String hostName = "192.168.0.2";
	private int port = 212;

	/**
	 * 登錄名
	 */
	private String userName = "anonymous";//匿名登錄,空字符串不行

	/**
	 * 登錄密碼
	 */
	private String password = "[email protected]";//隨便一個地址,我胡亂寫一個也可以運行的

	/**
	 * 需要訪問的遠程目錄
	 */
	private String remoteDir = "/software/dreamweaver/";

	/**
	 * 下載
	 */
	private void download() {
		try {
			// 鏈接到ftp服務器
			ftpClient.connect(hostName,port);
			System.out.println("連接到ftp服務器:" + hostName + " 成功..開始登錄");
			// 登錄.用戶名 密碼
			boolean b = ftpClient.login(userName, password);
			System.out.println("登錄成功." + b);
			
//			檢測連接是否成功
			int reply = ftpClient.getReplyCode();
			if(!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				System.err.println("FTP server refused connection.");
				System.exit(1);
			}
			
			ftpClient.setControlEncoding("GBK");
			FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);  
			conf.setServerLanguageCode("zh"); 
			FTPFile[] remoteFiles = ftpClient.listFiles(remoteDir);
			if (remoteFiles != null) {
				for (int i = 0; i < remoteFiles.length; i++) {
					String name = remoteFiles[i].getName();
					
					//下載
					File localFile = new File("c:/001/ftp/" + name);
					OutputStream is = new FileOutputStream(localFile);
					//retrieveFile的第一個參數需要是 ISO-8859-1 編碼,並且必須是完整路徑!
					String fileName = remoteDir + name;
					ftpClient.retrieveFile(new String(fileName.getBytes("GBK"),"ISO-8859-1"), is);
					is.close();
					
					//打印
					long length = remoteFiles[i].getSize();
					String readableLength = FileUtils.byteCountToDisplaySize(length);
					System.out.println(name + ":\t"+remoteFiles[i].isFile()+"\t" + readableLength);
					
				}
			}
			

			ftpClient.logout();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(outSteam);
			try {
				ftpClient.disconnect();
			} catch (IOException ioe) {
				ioe.printStackTrace();
			}
		}
	}
	
	/**
	 * 上傳
	 * */
	public void upload(){
		String srcUrl = "C:/001/菜單權限設計.doc";
		String targetFileName = "菜單權限設計.doc";
		try {
			ftpClient.connect(hostName,port);
			boolean b = ftpClient.login(userName, password);
			// 檢測連接是否成功
			int reply = ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				System.err.println("FTP server refused connection.");
				System.exit(1);
			}
			
			ftpClient.setControlEncoding("GBK");
			FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);  
			conf.setServerLanguageCode("zh"); 
			
			File srcFile = new File(srcUrl);
			FileInputStream fis = null;
			fis = new FileInputStream(srcFile);

			// 設置上傳目錄
			ftpClient.changeWorkingDirectory(remoteDir);
			ftpClient.setBufferSize(1024);
			ftpClient.setControlEncoding("GBK");

			// 設置文件類型(二進制)
			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
			// 上傳
			b = ftpClient.storeFile(targetFileName, fis);
			IOUtils.closeQuietly(fis);
			
			/*boolean bool = ftpClient.changeWorkingDirectory("/NC");
			System.out.println("changeWorkingDirectory="+bool);
			bool = ftpClient.makeDirectory("/NC");
			System.out.println("makeDirectory="+bool);*/
			
			ftpClient.logout();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				ftpClient.disconnect();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}

	/**
	 * 測試
	 * */
	public static void main(String[] args) {
		ListFtpFile listFtpfiles = new ListFtpFile();
		listFtpfiles.download();
		listFtpfiles.upload();
	}
}

需要common-io 和common-net兩個jar包的,同學們自己下載吧
發佈了27 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章