FTP实现文件/文件夹的上传或下载
2015-09-24 15:54
615 查看
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.io.IOUtils; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; /** * *【功能描述:ftp 工具类】 *【功能详细描述:逐条详细描述功能】 * @author 【lfssay】 * @see 【相关类/方法】 * @version 【类版本号, 2013-8-19 下午4:39:37】 * @since 【产品/模块版本】 */ public class FtpUtils { public static void main(String[] args) { // boolean flag = fileUpload("E:/tt/data","/admin/"); boolean flag = fileDownload("E:/tt/te/128","/admin/748/","748"); // System.out.println(flag); // boolean flag = deleteDir("/admin/3128/"); // boolean flag = deleteFile("/admin/2616/input/a0012.xml"); System.out.println(flag); } /** * *【功能描述:得到ftp 登陆结果 FtpClient】 *【功能详细描述:功能详细描述】 * @see 【类、类#方法、类#成员】 * @return * @throws IOException */ public static FTPClient getFTPClient() throws IOException{ FTPClient ftpClient = new FTPClient(); ftpClient.connect(ConfigReader.get("ftp.server","")); boolean flag = ftpClient.login(ConfigReader.get("ftp.username",""), ConfigReader.get("ftp.pwd","")); if(flag){ ftpClient.setControlKeepAliveTimeout(ConfigReader.getInt("ftp.active.time", 600)); return ftpClient; }else{ return null; } } /** * *【功能描述:上传文件 和文件夹】 *【功能详细描述:功能详细描述】 * @see 【类、类#方法、类#成员】 * @param filePath 上传文件的路径 * @param ftpRePath 上传后存储的相对位置 eg:/admin/pic/ * @return true, 只有当所有流程都成功才返回true ,不为true就表示失败 */ @SuppressWarnings("finally") public static boolean fileUpload(String filePath,String ftpRePath) { FTPClient ftpClient = new FTPClient(); try { ftpClient = getFTPClient(); ftpClient.setBufferSize(1024); ftpClient.setControlEncoding("GBK"); // 使用迭代器的方法以后,只会建立一个ftpClient 连接,方便ftp性能稳固 iterateUpload(ftpClient,filePath,ftpRePath); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("FTP上传失败 ", e); } finally { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("关闭FTP出现异常 ", e); } //当所有流程都成功以后返回成功 return true; } } /** * *【功能描述:上传工具类,迭代】 *【功能详细描述:功能详细描述】 * @see 【类、类#方法、类#成员】 * @param ftpClient * @param filePath * @param ftpRePath * @throws IOException */ public static void iterateUpload(FTPClient ftpClient,String filePath,String ftpRePath) throws IOException{ File srcFile = new File(filePath); // 原始上传文件 if(srcFile.isFile()){ FileInputStream fis = new FileInputStream(srcFile); ftpClient.changeWorkingDirectory(ftpRePath); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.storeFile(srcFile.getName(), fis); }else if(srcFile.isDirectory()){ // 只要是文件夹,就把当前文件夹的地址创建好。 ftpClient.makeDirectory(ftpRePath+File.separator+srcFile.getName()); File[] files = srcFile.listFiles(); // 如果为空,就只创建文件夹 for(File f:files){ iterateUpload(ftpClient,f.getAbsolutePath(),ftpRePath+File.separator+srcFile.getName()); } } } /** * *【功能描述:ftp 下载, 指定下载ftp上某一个目录或者文件到本地】 *【功能详细描述:功能详细描述】 * @see 【类、类#方法、类#成员】 * @param downloadPath 本地地址 * @param dir ftp上文件地址(相对的如:/admin/rt/) * @param fileName ftp上要下载的文件名 * @return true, 只有所有流程都成功才返回true, 不为true就表示失败 */ @SuppressWarnings("finally") public static boolean fileDownload(String downloadPath,String dir,String fileName) { FTPClient ftpClient = new FTPClient(); try { ftpClient = getFTPClient(); ftpClient.setBufferSize(1024); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); iterateDown(ftpClient,dir,downloadPath+File.separator+fileName); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("FTP下载失败 ", e); } finally { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("关闭FTP连接失败 ", e); } return true; } } /** * *【功能描述:下载功能的迭代器,】 *【功能详细描述:功能详细描述】 * @see 【类、类#方法、类#成员】 * @param ftpClient ftpClient 连接器 * @param dir ftp上的路径 * @param downloadPath 本地路径 * @throws IOException */ public static void iterateDown(FTPClient ftpClient,String dir,String downloadPath) throws IOException{ // 列出这个地址对应到的是文件夹还是文件 FTPFile[] files = ftpClient.listFiles(dir); for(FTPFile f:files){ //如果当前目录还没有创建,那么就在这里创建 File filedown = new File(downloadPath); if(!filedown.exists()){ filedown.mkdirs(); } String localPath = downloadPath+File.separator+f.getName(); File file = new File(localPath); if(f.isFile()){ FileOutputStream fos = null; fos = new FileOutputStream(localPath); String path = dir+File.separator+f.getName(); ftpClient.retrieveFile(path, fos); IOUtils.closeQuietly(fos); }else if(f.isDirectory()){ file.mkdirs(); iterateDown(ftpClient,dir+File.separator+f.getName(),localPath); } } } /** * *【功能描述:删除ftp 上指定的文件】 *【功能详细描述:功能详细描述】 * @see 【类、类#方法、类#成员】 * @param ftpPath ftp上的文件路径 * @return true 成功,false,失败 */ public static boolean deleteDir(String ftpPath){ FTPClient ftpClient = new FTPClient(); boolean flag = false; try { ftpClient = getFTPClient(); ftpClient.setControlKeepAliveTimeout(ConfigReader.getInt("ftp.active.time", 600)); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); flag = iterateDelete(ftpClient,ftpPath); ftpClient.disconnect(); } catch (IOException e) { // TODO 异常处理块 e.printStackTrace(); } return flag; } /** * *【功能描述:删除文件夹】 *【功能详细描述:功能详细描述】 * @see 【类、类#方法、类#成员】 * @param ftpClient * @param ftpPath 文件夹的地址 * @return true 表似成功,false 失败 * @throws IOException */ public static boolean iterateDelete(FTPClient ftpClient,String ftpPath) throws IOException{ FTPFile[] files = ftpClient.listFiles(ftpPath); boolean flag = false; for(FTPFile f:files){ String path = ftpPath+File.separator+f.getName(); if(f.isFile()){ // 是文件就删除文件 ftpClient.deleteFile(path); }else if(f.isDirectory()){ iterateDelete(ftpClient,path); } } // 每次删除文件夹以后就去查看该文件夹下面是否还有文件,没有就删除该空文件夹 FTPFile[] files2 = ftpClient.listFiles(ftpPath); if(files2.length==0){ flag = ftpClient.removeDirectory(ftpPath); }else{ flag = false; } return flag; } /** * *【功能描述:删除文件】 *【功能详细描述:功能详细描述】 * @see 【类、类#方法、类#成员】 * @param filePath * @return */ public static boolean deleteFile(String filePath){ boolean flag = false; try { FTPClient ftpClient = getFTPClient(); flag = ftpClient.deleteFile(filePath); } catch (IOException e) { // TODO 异常处理块 e.printStackTrace(); } return flag; } }以上内容转自:http://blog.csdn.net/linfssay/article/details/10117101
相关文章推荐
- 【Wordpress】以修改文章页面single.php下的评论栏说明一些Wordpress的函数与页面
- tp-from表单的验证
- 常见PHP数据库解决方案分析介绍
- PHP类的自动加载
- 又十个超级有用的PHP代码片段
- TP-登录
- phpcms v9模块操作列表
- PHP易混淆知识整理笔记
- php $_SERVER当前完整url的写法
- PHP直接修改表内容DataGrid功能实现代码
- php操作mysql
- PHP implode()函数
- 解决Yii2中刷新网页时验证码不刷新的问题
- php多数组关联
- PHP生成条形码大揭秘
- PHP学习笔记(五):函数
- php读取和保存base64编码的图片内容
- phpcms v9 数据库操作函数
- php商品对比功能代码分享
- 详解sftp实现对远程服务器的文件操作