import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import sun.net.TelnetInputStream; import sun.net.TelnetOutputStream; import sun.net.ftp.FtpClient; import org.apache.commons.net.ftp.FTPClient; public class FtpClientUtil { FtpClient ftpClient; private String server; private int port; private String userName; private String userPassword; public FtpClientUtil(String server,int port,String userName,String userPassword) { this.server=server; this.port=port; this.userName=userName; this.userPassword=userPassword; } /** * 链接到服务器 * @return */ public boolean open() { if(ftpClient!=null&&ftpClient.serverIsOpen()) return true; try { ftpClient= new FtpClient(); ftpClient.openServer(server,port); ftpClient.login(userName, userPassword); ftpClient.binary(); return true; } catch(Exception e) { e.printStackTrace(); ftpClient=null; return false; } } public boolean cd(String dir){ boolean f = false; try { ftpClient.cd(dir); } catch (IOException e) { // Logs.error(e.toString()); return f; } return true; } /** * 上传文件到FTP服务器 * @param localPathAndFileName 本地文件目录和文件名 * @param ftpFileName 上传后的文件名 * @param ftpDirectory FTP目录如:/path1/pathb2/,如果目录不存在回自动创建目录 ,全局ftp路径 * @throws Exception */ public boolean upload(String localDirectoryAndFileName,String ftpFileName,String ftpDirectory)throws Exception { if(!open()) return false; FileInputStream is=null; TelnetOutputStream os=null; ftpDirectory=new String(ftpDirectory.getBytes("ISO-8859-1"), "GBK"); try { char ch = ' '; if (ftpDirectory.length() > 0) ch = ftpDirectory.charAt(ftpDirectory.length() - 1); for (; ch == '/' || ch == '\\'; ch = ftpDirectory.charAt(ftpDirectory.length() - 1)) ftpDirectory = ftpDirectory.substring(0, ftpDirectory.length() - 1); int slashIndex = ftpDirectory.indexOf(47); int backslashIndex = ftpDirectory.indexOf(92); int index = slashIndex; String dirall = ftpDirectory; if (backslashIndex != -1 && (index == -1 || index > backslashIndex)) index = backslashIndex; String directory = ""; while (index != -1) { if (index > 0) { String dir = dirall.substring(0, index); directory = directory + "/" + dir; ftpClient.sendServer("XMKD " + directory + "\r\n"); ftpClient.readServerResponse(); } dirall = dirall.substring(index + 1); slashIndex = dirall.indexOf(47); backslashIndex = dirall.indexOf(92); index = slashIndex; if (backslashIndex != -1 && (index == -1 || index > backslashIndex)) index = backslashIndex; } ftpClient.sendServer("XMKD " + ftpDirectory + "\r\n"); ftpClient.readServerResponse(); // ftpClient.binary(); if(!"".equals(ftpFileName)){ os = ftpClient.put(ftpDirectory+"/"+new String(ftpFileName.getBytes("ISO-8859-1"), "GBK")); File file_in = new File(new String(localDirectoryAndFileName.getBytes("ISO-8859-1"), "GBK")); is = new FileInputStream(file_in); byte bytes[] = new byte[1024]; int i; while ((i = is.read(bytes)) != -1) os.write(bytes, 0, i); } //清理垃圾 return true; } catch(Exception e) { e.printStackTrace(); return false; } finally { if (is != null) is.close(); if (os != null) os.close(); } } /** * 从FTP服务器上下载文件并返回下载文件长度 * @param ftpDirectoryAndFileName * @param localDirectoryAndFileName * @return * @throws Exception */ public long download(String ftpDirectoryAndFileName,String localDirectoryAndFileName)throws Exception { long result = 0; if(!open()) return result; TelnetInputStream is = null; FileOutputStream os = null; try { is = ftpClient.get(new String(ftpDirectoryAndFileName.getBytes("ISO-8859-1"), "GBK")); java.io.File outfile = new java.io.File(new String(localDirectoryAndFileName.getBytes("ISO-8859-1"), "GBK")); os = new FileOutputStream(outfile); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); result = result + c; } } catch (Exception e) { throw e; } finally { if (is != null) is.close(); if (os != null) os.close(); } return result; } /** * 返回FTP目录下的文件列表 * @param ftpDirectory * @return */ public List<String> getFileNameList(String ftpDirectory) { List<String> list = new ArrayList<String>(); if(!open()) return list; try { DataInputStream dis = new DataInputStream(ftpClient.nameList(ftpDirectory)); String filename = ""; while((filename=dis.readLine())!=null) { list.add(filename); } } catch (Exception e) { e.printStackTrace(); } return list; } /** * 删除FTP上的文件 * @param ftpDirAndFileName */ public boolean deleteFile(String ftpDirAndFileName) { if(!open()) return false; ftpClient.sendServer("DELE "+ftpDirAndFileName+"\r\n"); return true; } /** * 删除FTP目录 * @param ftpDirectory */ public boolean deleteDirectory(String ftpDirectory) { if(!open()) return false; ftpClient.sendServer("XRMD "+ftpDirectory+"\r\n"); return true; } /** * 检查文件夹是否存在 * * @param dir * @param ftpClient * @return */ private boolean isDirExist( FTPClient ftpClient ,String dir) { boolean isDirExist = false; try { isDirExist = ftpClient.changeWorkingDirectory(dir); } catch (IOException e) { e.printStackTrace(); } return isDirExist; } /** * 关闭链接 */ public void close() { try { if(ftpClient!=null&&ftpClient.serverIsOpen()) ftpClient.closeServer(); }catch(Exception e) { } } }