关于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和备份文件方法。