package com.logistics.function; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import android.os.Handler; import android.os.Message; import android.util.Log; /** * @author gary * */ /** * @author gary * */ public class FtpUtil { private FTPClient ftp; public FtpUtil() { ftp = new FTPClient(); } /** * 连接到FTP * * @param host * FTP服务器的IP地址 * @param port * FTP服务器的端口 * @param userName * FTP服务器的用户名 * @param passWord * FTP服务器的密码 */ public boolean connect(String host, int port, String userName, String passWord) { boolean result = true; try { doEvent(RESULT_DOING, "正在连接服务器..."); ftp.connect(host, port);// 连接FTP服务器 doEvent(RESULT_DOING, "正在登陆服务器..."); ftp.login(userName, passWord);// 登陆FTP服务器 if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { result = false; doEvent(RESULT_ERROR, "未连接到FTP,用户名或密码错误。"); ftp.disconnect(); } else { doEvent(RESULT_DOING, "FTP连接成功。"); } } catch (SocketException e) { e.printStackTrace(); doEvent(RESULT_ERROR, "FTP的IP地址可能错误,请正确配置。"); } catch (IOException e) { e.printStackTrace(); doEvent(RESULT_ERROR, "FTP的端口错误,请正确配置。"); } return result; } // 断开连接 public void disconnect() { if (ftp.isConnected()) { try { doEvent(RESULT_DOING, "断开了FTP连接。"); ftp.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } public void upLoadFileInThread(final String local, final String remote) { new Thread() { public void run() { uploadfile(local, remote); }; }.start(); } /** * @param local * 本地 如果是文件夹,必须以/结尾 * @param remote * 远程目前只考虑远程为文件夹,不改文件名,必须以/结尾 */ public void uploadfile(String local, String remote) { File f = new File(local); try { CreateDirecroty(remote); } catch (IOException e1) { doEvent(RESULT_ERROR, "创建文件夹出错" + remote); e1.printStackTrace(); } if (f.exists()) { if (f.isFile()) { try { uploadFile(local, remote, f.getName()); doEvent(RESULT_OVER, "上传文件结束"); } catch (IOException e) { e.printStackTrace(); doEvent(RESULT_ERROR, "上传文件出错" + f.getName()); } } else if (f.isDirectory() && !f.getName().equals(".") && !f.getName().equals("..")) { try { uploadDir(local, remote, f.getName()); doEvent(RESULT_OVER, "上传文件结束"); } catch (IOException e) { e.printStackTrace(); doEvent(RESULT_ERROR, "上传文件夹出错" + f.getName()); } } } else { doEvent(RESULT_ERROR, "没有发现文件" + local); } disconnect(); } private void createFtpDir(String remoteDir,String remoteNew) throws IOException { ftp.changeWorkingDirectory(new String(remoteDir)); if (!ftp.changeWorkingDirectory(new String(remoteNew))) { ftp.makeDirectory(remoteNew); } ftp.changeWorkingDirectory(remoteNew); } private void uploadDir(String local, String remote, String dirName) throws IOException { File file = new File(local); if (file.exists()) { String remoteDir = remote + dirName + "/"; createFtpDir(remote,dirName); File[] files = file.listFiles(); for (File f : files) { if (f.isDirectory() && !f.getName().equals(".") && !f.getName().equals("..")) { uploadDir(f.getPath(), remoteDir, f.getName()); } else if (f.isFile()) { uploadFile(f.getPath(), remoteDir, f.getName()); } } } } /** * @param local * @param remote * @param fileName * @throws IOException */ private void uploadFile(String local, String remote, String fileName) throws IOException { //createFtpDir(remote); upload(local, fileName); } /** * 上传文件到FTP服务器 * * @param local * 本地文件名称,绝对路径 * @param remote 远程文件路径,支持多级目录嵌套,支持递归创建不存在的目录结构 * @throws IOException */ private boolean upload(String local, String remote) throws IOException { boolean result = true; // 设置PassiveMode传输 ftp.enterLocalPassiveMode(); // 设置以二进制流的方式传输 ftp.setFileType(FTP.BINARY_FILE_TYPE); File f = new File(local); uploadFile(remote, f); return result; } private void uploadFile(String remoteFile, File localFile) throws IOException { InputStream in = new FileInputStream(localFile); ftp.storeFile(remoteFile, in); in.close(); } public static final int RESULT_ERROR = 0; public static final int RESULT_DOING = 1; public static final int RESULT_OVER = 2; private void doEvent(int result, String strRes) { Log.d("gary", result + " " + strRes); Message msg = new Message(); msg.what = result; msg.obj = strRes; handler.sendMessage(msg); } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { int r = msg.what; String s = (String) msg.obj; if (mEvent != null) mEvent.onResult(r, s); super.handleMessage(msg); } }; private IFtpEvent mEvent; public void setEvent(IFtpEvent event) { mEvent = event; } public interface IFtpEvent { public void onResult(int result, String strRes); } /** */ /** * 递归创建远程服务器目录 * * @param remote * 远程服务器文件绝对路径 * * @return 目录创建是否成功 * @throws IOException */ public boolean CreateDirecroty(String remote) throws IOException { boolean success = true; String directory = remote.substring(0, remote.lastIndexOf("/") + 1); // 如果远程目录不存在,则递归创建远程服务器目录 if (!directory.equalsIgnoreCase("/") && !ftp.changeWorkingDirectory(new String(directory))) { 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)); if (!ftp.changeWorkingDirectory(subDirectory)) { if (ftp.makeDirectory(subDirectory)) { ftp.changeWorkingDirectory(subDirectory); } else { System.out.println("创建目录失败"); success = false; return success; } } start = end + 1; end = directory.indexOf("/", start); // 检查所有目录是否创建完毕 if (end <= start) { break; } } } return success; } }