zoukankan      html  css  js  c++  java
  • 普通的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和备份文件方法。

  • 相关阅读:
    python_paramiko_SSHException Invalid requirement, parse error at
    python_实现发送邮件功能
    人生格言-羊皮卷
    xshell的Solarized Dark配色方案
    vim常用的配置
    Hadoop1.2.1 HDFS原理
    Hadoop1.x目录结构及Eclipse导入Hadoop源码项目
    Hadoop1.2.1 出现Warning: $HADOOP_HOME is deprecated.的解决方案
    Hadoop1.2.1 启停的Shell 脚本分析
    Hadoop1.2.1 配置文件详解
  • 原文地址:https://www.cnblogs.com/kwzblog/p/7479550.html
Copyright © 2011-2022 走看看