博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
普通的java Ftp客户端的文件上传
阅读量:4451 次
发布时间:2019-06-07

本文共 12979 字,大约阅读时间需要 43 分钟。

关于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
numList = new ArrayList
(); 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和备份文件方法。

转载于:https://www.cnblogs.com/kwzblog/p/7479550.html

你可能感兴趣的文章
Java 系统学习梳理_【All】
查看>>
js中prototype用法(转)
查看>>
POJ 3667 线段树的区间合并简单问题
查看>>
汇编学习2:关于编译过程和后缀名 .s和.S的区别
查看>>
Linq调试实时输出信息扩展方法(摘抄)
查看>>
Python学习笔记七(面向对象)
查看>>
使用 padding-bottom 设置高度基于宽度的自适应
查看>>
进程有一个全局变量i,还有有两个线程。i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?...
查看>>
DB2 数据库中字段特定字符替换为空
查看>>
解决VS2015启动界面卡在白屏的处理方法
查看>>
IIS下配置跨域设置Access-Control-Allow-Origin
查看>>
JS金字塔
查看>>
Ajax与JSON的一些总结
查看>>
C#常用控件属性及方法介绍
查看>>
51单片机寻址方式
查看>>
DB太大?一键帮你收缩所有DB文件大小(Shrink Files for All Databases in SQL Server)
查看>>
二叉树
查看>>
Leetcode: Convert Sorted Array to Binary Search Tree
查看>>
#python#类和实例绑定属性和方法的总结
查看>>
C#委托事件的理解猫与老鼠的故事
查看>>