普通的java Ftp客户端的文件上传

Posted kwz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了普通的java Ftp客户端的文件上传相关的知识,希望对你有一定的参考价值。

关于ftp上传文件其实并不难,但有时候面对现实的环境还是很蛋疼的,今天我就分享一下,普通的上传文件文件至FTP的方式,它满足大部分FTP,但也有特别的,下篇博客会提及到。

下面我用一个FtpUtil,来实现各种功能:

我们这里的主要功能是:

把本地文件夹下的文件上传到ftp的一个文件夹下 ,如果上传成功,就把上传成功的文件备份到另一个文件夹下,如果备份成功,就可以拿备份成功的文件删除了。

直接上代码了!

package cn.tendency.utils;

import java.io.File;

import org.apache.commons.net.ftp.*;
import org.apache.log4j.Logger;

import java.io.*;
import java.util.ArrayList;


public class FtpUtil {

	 private static Logger log = Logger.getLogger(FtpUtil.class);
	 private  FTPClient ftp;
	
	 /**
	  * 文件上传FTP 连接ftp服务器
	  * @param url
	  * @param port
	  * @param username
	  * @param password
	  * @param zipPath
	  * @param ftpPath
	  * @param destPath
	  */
	 public  void fileUPL(String url, int port, String username, String password,String zipPath, String ftpPath,String destPath) {
			// 连接ftp
		 boolean succ =false;
		 boolean flag = false;
			try {
				  succ = this.connect(ftpPath, url, port, username, password);
				  log.info("连接ftp"+succ);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				log.error("连接FTP异常:"+e.getMessage());
			}
			// 切换目录
//			FtpUtil.changeDirectory(ftp, ftpPath);
			if(succ){
				log.info("连接FTP成功!开始上传文件");
				  File file = new File(zipPath); 
				 try {
					flag=this.upload(file);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					log.error("上传文件异常:"+e.getMessage());
					e.printStackTrace();
				}
				//暂时先把这行注释
				FtpUtil.disconnectFTP(ftp);
			}
			
/*//			上传成功后备份压缩文件,不成功可以下次再传
			if (flag){
				boolean flag1 = FilesUtil.copyFile(zipPath, destPath);
				if (flag1) {//备份成功后删除文件;
					FilesUtil.deleteDir(zipPath);
				}
			}else{
				log.error("上传文件失败!");
			}*/
		}
	/**
	 * 创建连接
	 * @param url
	 * @param port
	 * @param username
	 * @param password
	 * @return
	 */
	    public static FTPClient connectFTP(String url, int port, String username, String password) {
	        //创建ftp
	        FTPClient ftp = null;
	        try {
	            //创建地址
	        	//InetAddress addr = new InetSocketAddress(url, port);
	            //连接
	        	 int reply;      
	            ftp = new FTPClient();
	            ftp.connect(url, port);
	            ftp.login(username, password);
	            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
	            reply = ftp.getReplyCode();      
		        if (!FTPReply.isPositiveCompletion(reply)) {      
		            ftp.disconnect();      
		            return ftp;      
		        }      
		        ftp.changeWorkingDirectory("/");
	            //登陆
	            //ftp.login(username, password.toCharArray());
//	            ftp.login(username, password);
//	            ftp.changeWorkingDirectory(path);
//	            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//	            ftp.setDataTimeout(6000);
//	            ftp.setConnectTimeout(6000);
	            
//	            ftp.setSoTimeout(500000);
	
	        } catch (Exception e) {
	            e.printStackTrace();
	        } 
	        return ftp;
	    }

	    
	    
	    /**  
	     *   
	     * @param path 上传到ftp服务器哪个路径下     
	     * @param addr 地址  
	     * @param port 端口号  
	     * @param username 用户名  
	     * @param password 密码  
	     * @return  
	     * @throws Exception  
	     */    
	    private  boolean connect(String path,String addr,int port,String username,String password) throws Exception {      
	        boolean result = false;      
	        ftp = new FTPClient();      
	        int reply;      
	        ftp.connect(addr,port);      
	        ftp.login(username,password);      
	        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);   
	        //设置ftp连接超时时间
//	        ftp.setDataTimeout(60000);
	        reply = ftp.getReplyCode();      
	        if (!FTPReply.isPositiveCompletion(reply)) {      
	            ftp.disconnect();      
	            return result;      
	        }      
	        ftp.changeWorkingDirectory(path);      
	        result = true;      
	        return result;      
	    }
	    /**
	     * 切换目录
	     * @param ftp
	     * @param path
	     */
	    public static void changeDirectory(FTPClient ftp, String path) {
	        try {
	          //  ftp.changeDirectory(path);
	        	ftp.changeWorkingDirectory(path) ;
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }

	    /**
	     * 关闭ftp
	     * @param ftp
	     */
	    public static void disconnectFTP(FTPClient ftp){
	        try {
	            //ftp.close();
	        	ftp.disconnect();
	            log.info("disconnect success!!");
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }

	    
	    /** 
	     * Description: 向FTP服务器上传文件 
	     * @Version1.0 
	     * @param url FTP服务器hostname 
	     * @param port FTP服务器端口 
	     * @param username FTP登录账号 
	     * @param password FTP登录密码 
	     * @param path FTP服务器保存目录 
	     * @param filename 上传到FTP服务器上的文件名 
	     * @param input 输入流 
	     * @return 成功返回true,否则返回false 
	     */  
	    public static boolean uploadFile(String url,int port,String username, String password, String path, String filename, InputStream input) {  
	        boolean success = false;  
	        FTPClient ftp = new FTPClient();  
	        try {  
	            int reply;  
	            ftp.connect(url, port);//连接FTP服务器  
	            //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器  
	            ftp.login(username, password);//登录  
	            reply = ftp.getReplyCode();  
	            if (!FTPReply.isPositiveCompletion(reply)) {  
	                ftp.disconnect();  
	                return success;  
	            }  
	            ftp.changeWorkingDirectory(path);  
	            ftp.storeFile(filename, input);           
	              
	            input.close();  
	            ftp.logout();  
	            success = true;  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	        } finally {  
	            if (ftp.isConnected()) {  
	                try {  
	                    ftp.disconnect();  
	                } catch (IOException ioe) {  
	                }  
	            }  
	        }  
	        return success;  
	    }
	    
	    
	    /**
	     * 上传文件
	     * @param localFile
	     * @param ftpFile
	     * @param ftp
	     */
	    public static boolean upload_1(String localFile, String ftpFile,FTPClient ftp,String url, int port, 
	    		String username, String password) {
	    	boolean flag = false ;
	        OutputStream os = null;
	        FileInputStream fis = null;
	       
	        try {
	            // 将ftp文件加入输出流中。输出到ftp上
	            File file = new File(localFile);
	            File[] file1 = file.listFiles();
	            if(null == file1 || file1.length<1){  
                    log.error("待上传的文件目录:" + localFile + "里面不存在文件.");  
                }else{
	            // 创建一个缓冲区
                	for(int i=0;i<file1.length;i++){ 
//                		String str = ftpFile+"/"+file1[i].getName();
                		   ftp.changeWorkingDirectory("/"); 
                		   String str =file1[i].getName();
                		   os = ftp.appendFileStream(str);
                		   if (os == null ){
                			   FtpUtil.disconnectFTP(ftp);
                			   ftp = FtpUtil.connectFTP(url, port, username,password);
                			   ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
               	               ftp.setDataTimeout(6000);
               	               ftp.setConnectTimeout(6000);
                			   os = ftp.appendFileStream(str);
                		   }
	                       fis = new FileInputStream(file1[i]);
	                       byte[] bytes = new byte[1024*10];
	                       int c;
	                       while((c = fis.read(bytes)) != -1){
	                        os.write(bytes, 0, c);
	                  }
	                       os.flush();
	                       os.close();
	                       fis.close();
//	                       ftp1.disconnect();
	            } 
                	flag = true ;  
                	 log.info("upload success!!");
                }
	           
                
	        } catch (Exception e) {
	            e.printStackTrace();
	        }  finally {
	            try {
	                if(os!=null) {
	                    os.close();
	                }
	                if(fis!=null) {
	                    fis.close();
	                }	            
	            } catch (IOException e) {
	                e.printStackTrace();
	            }
	        }
	        return flag ;
	    }
	    
	    
	    
	    /**  
	     *   
	     * @param file 上传的文件或文件夹  
	     * @throws Exception  
	     */    
	    private boolean upload(File file) throws Exception{      
	    	boolean flag=false;
	    	ArrayList<Integer> numList = new ArrayList<Integer>();
	    	int a=0;
	    	try {
	    		if(file.isDirectory()){ //我们读的是目录
	    			log.info("上传的是文件夹");
		           // ftp.makeDirectory(file.getName());                
		           // ftp.changeWorkingDirectory(file.getName());      
		            String[] files = file.list(); 
		            //文件数
		            int fileNum=files.length;
		            log.info("文件夹下有"+fileNum+"个文件");
		            if(fileNum>4){
		            	fileNum=4;
		            }
		            for (int i = 0; i < fileNum; i++) {      
		                File file1 = new File(file.getPath()+"\\"+files[i] );      
		                if(file1.isDirectory()){      
		                	upload(file1);      
		                    ftp.changeToParentDirectory();      
		                }else{ //执行这一个                   
		                    File file2 = new File(file.getPath()+"\\"+files[i]);      
		                    FileInputStream input = new FileInputStream(file2); 
		                    ftp.enterLocalPassiveMode();
		                    ftp.storeFile(file2.getName(), input);  
		                    log.info("上传文件"+file.getPath()+"\\"+files[i]+"成功");
		                    input.close();   
		                    flag=true;
//			                上传成功后备份压缩文件,不成功可以下次再传
			    			if (flag){
			    				//备份
			    				boolean flag1 = FilesUtil.copyFile2(file2, "D:\\MACCOLLECT\\laibin_maccollect\\maccollect\\laibin\\zip_backup");
			    				
			    				if (flag1) {//备份成功后删除文件;
			    					file2.delete();
			    					
			    				}else {
			    					log.error("备份文件失败!");
								}
			    			}
			    			else{
			    				log.error("上传文件失败!");
			    			}
		                }
		               
		            }      
		        }else{ //本项目不走这一个     
		            File file2 = new File(file.getPath());      
		            FileInputStream input = new FileInputStream(file2);  
		            ftp.enterLocalPassiveMode();
		            ftp.storeFile(file2.getName(), input);      
		            input.close();      
		            flag=true;
		        }      
		
			} catch (Exception e) {
				flag=false;
				log.error("上传文件异常:"+e.getMessage());
				e.printStackTrace();
			}
	        return flag;
	    }
}

 下面是文件备份的代码:

分两种情况:第一种是备份一个目录下的所有文件夹到另一个目录下

                     第二种是备份单个文件到另一个目录下

首先是第一种情况:

 

/*
	 * 拷贝文件备份到对应的日期目录下,引用XmlCopyFile方法;
	 */
		public static boolean copyFile(String srcFileName, String destFileName) {
			boolean flag = false;
			File srcFile = new File(srcFileName);		
			// 判断源文件是否存在
			if (!srcFile.exists()) {
				log.error("源文件:" + srcFileName + "不存在!");
				return flag;
			} else if (!srcFile.isDirectory()) {
				log.error("复制失败,源文件:" + srcFileName + "不是一个路径!");
				return flag;
			}	
				File[] Bfile = srcFile.listFiles();
			    flag = FilesUtil.XmlCopyFile(destFileName, Bfile);
			    return flag;
		}





public static boolean XmlCopyFile(String destFileName, File[] Bfile) {
		// File srcFile = new File(srcFileName);
		// // 判断源文件是否存在
		// if (!srcFile.exists()) {
		// log.error("源文件:" + srcFileName + "不存在!");
		// return false;
		// } else if (!srcFile.isDirectory()) {
		// log.error("复制失败,源文件:" + srcFileName + "不是一个路径!");
		// return false;
		// }
		// String month=
		destFileName = destFileName  
				+  FilesUtil.getFormatDate();
		log.info("备份路径:"+destFileName);
		// 判断目标文件是否存在
		File destFile = new File(destFileName);
		if (!destFile.exists()) {
			try {
				boolean flag = destFile.mkdirs();
				log.info("true  or  false:" + flag);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		// 复制文件
		int byteread = 0; // 读取的字节数
		InputStream in = null;
		OutputStream out = null;
		try {
			if (null == Bfile || Bfile.length < 1) {
				log.error("待复制的文件目录里面不存在文件.");
			} else {
				for (int i = 0; i < Bfile.length; i++) {
					in = new FileInputStream(Bfile[i]);
					out = new FileOutputStream(destFileName + "/"
							+ Bfile[i].getName());
					byte[] buffer = new byte[1024];
					while ((byteread = in.read(buffer)) != -1) {
						out.write(buffer, 0, byteread);
					}
					out.close();
					in.close();
				}
			}
			log.info("backup success!");
			return true;
		} catch (FileNotFoundException e) {
			return false;
		} catch (IOException e) {
			return false;
		} finally {
			try {
				if (out != null)
					out.close();
				if (in != null)
					in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

 第二种情况:

/*
         * 把上面的方法改造
         * 拷贝文件备份到对应的日期目录下,引用XmlCopyFile2方法;
         */
            public static boolean copyFile2(File srcFile, String destFileName) {
                boolean flag = false;
                        
                // 判断源文件是否存在
                if (!srcFile.exists()) {
                    log.error("源文件:" + srcFile + "不存在!");
                    return flag;
                } 
                    
                    flag = FilesUtil.XmlCopyFile2(destFileName, srcFile);
                    return flag;
            }





public static boolean XmlCopyFile2(String destFileName, File Bfile) {
    
        destFileName = destFileName  +  FilesUtil.getFormatDate();
        log.info("备份路径:"+destFileName);
        // 判断目标文件是否存在
        File destFile = new File(destFileName);
        if (!destFile.exists()) {
            try {
                boolean flag = destFile.mkdirs();
                log.info("true  or  false:" + flag);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 复制文件
        int byteread = 0; // 读取的字节数
        InputStream in = null;
        OutputStream out = null;
        try {
            
                
                    in = new FileInputStream(Bfile);
                    out = new FileOutputStream(destFileName + "/"
                            + Bfile.getName());
                    byte[] buffer = new byte[1024];
                    while ((byteread = in.read(buffer)) != -1) {
                        out.write(buffer, 0, byteread);
                    }
                    out.close();
                    in.close();
                
            
            log.info("backup success!");
            return true;
        } catch (FileNotFoundException e) {
            return false;
        } catch (IOException e) {
            return false;
        } finally {
            try {
                if (out != null)
                    out.close();
                if (in != null)
                    in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 好了,以上就是普通的上传ftp和备份文件方法。



以上是关于普通的java Ftp客户端的文件上传的主要内容,如果未能解决你的问题,请参考以下文章

java用户HTTPURLConnection 上传文件过程是先把文件写入流中,然后上传吗,可以边度边传吗?

FTP客户端上传怎么样?

JAVA如何把本地文件上传到服务器。

java在浏览器上获取FTP读文件路径

FTP文件传输服务

java web 怎么从服务器下载文件到客户端的指定位置