Android FTP操作
来源:互联网 发布:大数据 服务型政府 编辑:程序博客网 时间:2024/06/06 19:48
这里使用第三方commons-net-3.0.1.jar
连接FTP
private void ftpLogin() throws IOException { int reply; // FTP连接 FTPClient ftpClient = new FTPClient(); ftpClient.setConnectTimeout(3000); ftpClient.setControlEncoding("GBK"); try { ftpClient.connect(hostName, port); reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); sendHandleMsg(0, FTPDOWNLOAD_MODE.Connect_Failure); return; } } catch (Exception e) { sendHandleMsg(0, FTPDOWNLOAD_MODE.Connect_Failure); return; } // FTP登陆 try { ftpClient.login(username, password); reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); sendHandleMsg(0, FTPDOWNLOAD_MODE.Login_Failure); } ftpClient.enterLocalPassiveMode();// 设置被动模式 String sysType = ftpClient.getSystemType(); FTPClientConfig config = new FTPClientConfig(sysType.split(" ")[0]); config.setServerLanguageCode("zh"); ftpClient.configure(config); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); } catch (Exception e) { sendHandleMsg(0, FTPDOWNLOAD_MODE.Login_Failure); return; } sendHandleMsg(0, FTPDOWNLOAD_MODE.Login_Success); }
下载
/** * 从FTP服务器上下载文件,支持断点续传 * * @param remote * 远程文件路径 * @param local * 本地文件路径 * @return 上传的状态 * @throws IOException */ public DownloadStatus download(String remote, String local, FTPClient ftpClient) throws IOException { // 设置被动模式 ftpClient.enterLocalPassiveMode(); // 设置以二进制方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setControlEncoding("GBK"); DownloadStatus result; // 检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"), "iso-8859-1")); if (files.length != 1) { System.out.println("远程文件不存在"); for (int i = 0; i < files.length; i++) { } return DownloadStatus.Remote_File_Noexist; } long lRemoteSize = files[0].getSize(); File f = new File(local); // 本地存在文件,进行断点下载 if (f.exists()) { long localSize = f.length(); // 判断本地文件大小是否大于远程文件大小 if (localSize >= lRemoteSize) { System.out.println("本地文件大于远程文件,下载中止"); return DownloadStatus.Local_Bigger_Remote; } // 进行断点续传,并记录状态 FileOutputStream out = new FileOutputStream(f, true); ftpClient.setRestartOffset(localSize); InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"), "iso-8859-1")); byte[] bytes = new byte[1024]; int c; while ((c = in.read(bytes)) != -1) { out.write(bytes, 0, c); localSize += c; } in.close(); out.close(); boolean isDo = ftpClient.completePendingCommand(); if (isDo) { result = DownloadStatus.Download_From_Break_Success; } else { result = DownloadStatus.Download_From_Break_Failed; } } else { OutputStream out = new FileOutputStream(f); InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"), "iso-8859-1")); byte[] bytes = new byte[1024]; // long step = lRemoteSize / 100; long process = 0; long localSize = 0L; int c; while ((c = in.read(bytes)) != -1) { out.write(bytes, 0, c); localSize += c; } in.close(); out.close(); boolean upNewStatus = ftpClient.completePendingCommand(); if (upNewStatus) { result = DownloadStatus.Download_New_Success; } else { result = DownloadStatus.Download_New_Failed; } } return result; }
上传
/** * 上传文件到FTP服务器,支持断点续传 * * @param local * 本地文件名称,绝对路径 * @param remote * 远程文件路径 * @return 上传结果 * @throws IOException */ public UploadStatus upload(String local, String remote, FTPClient ftpClient) throws IOException { // 设置PassiveMode传输 ftpClient.enterLocalPassiveMode(); // 设置以二进制流的方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setControlEncoding("GBK"); UploadStatus result; // 对远程目录的处理 String remoteFileName = remote; if (remote.contains("/")) { remoteFileName = remote.substring(remote.lastIndexOf("/") + 1); // 创建服务器远程目录结构,创建失败直接返回 if (CreateDirecroty(remote, ftpClient) == UploadStatus.Create_Directory_Fail) { return UploadStatus.Create_Directory_Fail; } } // 检查远程是否存在文件 FTPFile[] files = ftpClient.listFiles(new String(remoteFileName.getBytes("GBK"), "iso-8859-1")); if (files.length == 1) { long remoteSize = files[0].getSize(); File f = new File(local); long localSize = f.length(); if (remoteSize == localSize) { return UploadStatus.File_Exits; } else if (remoteSize > localSize) { return UploadStatus.Remote_Bigger_Local; } // 尝试移动文件内读取指针,实现断点续传 result = uploadFile(remoteFileName, f, ftpClient, remoteSize); // 如果断点续传没有成功,则删除服务器上文件,重新上传 if (result == UploadStatus.Upload_From_Break_Failed) { if (!ftpClient.deleteFile(remoteFileName)) { return UploadStatus.Delete_Remote_Faild; } result = uploadFile(remoteFileName, f, ftpClient, 0); } } else { result = uploadFile(remoteFileName, new File(local), ftpClient, 0); } return result; }
创建远程服务器目录
/** * 递归创建远程服务器目录 * * @param remote * 远程服务器文件绝对路径 * @param ftpClient * FTPClient对象 * @return 目录创建是否成功 * @throws IOException */ public UploadStatus CreateDirecroty(String remote, FTPClient ftpClient) throws IOException { UploadStatus status = UploadStatus.Create_Directory_Success; String directory = remote.substring(0, remote.lastIndexOf("/") + 1); if (!directory.equalsIgnoreCase("/") && !ftpClient.changeWorkingDirectory(new String(directory.getBytes("GBK"), "iso-8859-1"))) { // 如果远程目录不存在,则递归创建远程服务器目录 int start = 0; int end = 0; if (directory.startsWith("/")) { start = 1; } else { start = 0; } end = directory.indexOf("/", start); while (true) { String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1"); if (!ftpClient.changeWorkingDirectory(subDirectory)) { if (ftpClient.makeDirectory(subDirectory)) { ftpClient.changeWorkingDirectory(subDirectory); } else { System.out.println("创建目录失败"); return UploadStatus.Create_Directory_Fail; } } start = end + 1; end = directory.indexOf("/", start); // 检查所有目录是否创建完毕 if (end <= start) { break; } } } return status; }
0 0
- Android FTP操作
- ftp操作
- FTP操作
- ftp操作
- Ftp操作
- 【python FTP】python操作FTP
- java操作FTP
- ftp一些操作函数.
- (转)FTP 操作
- C# FTP 各种操作
- java 中的 Ftp操作
- FTP常用操作类
- FTP文件操作。
- WinInet中的FTP操作
- ftp---文件操作
- C# FTP操作类
- java FTP操作
- FTP命令的操作
- 黑马程序员_正则表达式的常见写法和应用
- leetcode Longest Common Prefix
- tableview Group的使用-section Header的高度显示一致
- mysql配置目录错误:在安装mysql 5.6.19 时执行cmake命令是出现CMake Error: The source directory does not appear to contai
- 软件工程师的创业陷阱:接私活
- Android FTP操作
- iOS 初学笔记之常见的几种界面传值方式
- ie中https(SSL)不能下载问题解决方案 - javaee
- Android 轻松实现仿QQ空间下拉刷新
- 2015年百度之星程序设计大赛 - 初赛(2)【题解】
- 超级详细解读基本排序算法(不看后悔,带排序演示动画)
- PHP Memcached的扩展
- read和fread
- Git客户端(Windows系统)的使用