详解JAVA中使用FTPClient工具类上传下载
在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件、下载文件。本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件。
1、写一个javabean文件,描述ftp上传或下载的信息
实例代码:
public class FtpUseBean { private String host; private Integer port; private String userName; private String password; private String ftpSeperator; private String ftpPath=""; private int repeatTime = 0;//连接ftp服务器的次数 public String getHost() { return host; } public void setHost(String host) { this.host = host; } public Integer getPort() { return port; } public void setPort(Integer port) { this.port = port; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public void setFtpSeperator(String ftpSeperator) { this.ftpSeperator = ftpSeperator; } public String getFtpSeperator() { return ftpSeperator; } public void setFtpPath(String ftpPath) { if(ftpPath!=null) this.ftpPath = ftpPath; } public String getFtpPath() { return ftpPath; } public void setRepeatTime(int repeatTime) { if (repeatTime > 0) this.repeatTime = repeatTime; } public int getRepeatTime() { return repeatTime; } /** * take an example:<br> * ftp://userName:password@ip:port/ftpPath/ * @return */ public String getFTPURL() { StringBuffer buf = new StringBuffer(); buf.append("ftp://"); buf.append(getUserName()); buf.append(":"); buf.append(getPassword()); buf.append("@"); buf.append(getHost()); buf.append(":"); buf.append(getPort()); buf.append("/"); buf.append(getFtpPath()); return buf.toString(); } }
2、导入包commons-net-1.4.1.jar
package com.util; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.SocketException; import java.net.URL; import java.net.URLConnection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import com.bean.FtpUseBean; public class FtpUtil extends FTPClient { private static Log log = LogFactory.getLog(FtpUtil.class); private FtpUseBean ftpUseBean; //获取目标路径下的文件属性信息,主要是获取文件的size private FTPFile[] files; public FtpUseBean getFtpUseBean() { return ftpUseBean; } public FtpUtil(){ super(); } public void setFtpUseBean(FtpUseBean ftpUseBean) { this.ftpUseBean = ftpUseBean; } public boolean ftpLogin() { boolean isLogined = false; try { log.debug("ftp login start ..."); int repeatTime = ftpUseBean.getRepeatTime(); for (int i = 0; i < repeatTime; i++) { super.connect(ftpUseBean.getHost(), ftpUseBean.getPort()); isLogined = super.login(ftpUseBean.getUserName(), ftpUseBean.getPassword()); if (isLogined) break; } if(isLogined) log.debug("ftp login successfully ..."); else log.debug("ftp login failed ..."); return isLogined; } catch (SocketException e) { log.error("", e); return false; } catch (IOException e) { log.error("", e); return false; } catch (RuntimeException e) { log.error("", e); return false; } } public void setFtpToUtf8() throws IOException { FTPClientConfig conf = new FTPClientConfig(); super.configure(conf); super.setFileType(FTP.IMAGE_FILE_TYPE); int reply = super.sendCommand("OPTS UTF8 ON"); if (reply == 200) { // UTF8 Command super.setControlEncoding("UTF-8"); } } public void close() { if (super.isConnected()) { try { super.logout(); super.disconnect(); log.debug("ftp logout ...."); } catch (Exception e) { log.error(e.getMessage()); throw new RuntimeException(e.toString()); } } } public void uploadFileToFtpByIS(InputStream inputStream, String fileName) throws IOException { super.storeFile(ftpUseBean.getFtpPath()+fileName, inputStream); } public File downFtpFile(String fileName, String localFileName) throws IOException { File outfile = new File(localFileName); OutputStream oStream = null; try { oStream = new FileOutputStream(outfile); super.retrieveFile(ftpUseBean.getFtpPath()+fileName, oStream); return outfile; } finally { if (oStream != null) oStream.close(); } } public FTPFile[] listFtpFiles() throws IOException { return super.listFiles(ftpUseBean.getFtpPath()); } public void deleteFtpFiles(FTPFile[] ftpFiles) throws IOException { String path = ftpUseBean.getFtpPath(); for (FTPFile ff : ftpFiles) { if (ff.isFile()) { if (!super.deleteFile(path + ff.getName())) throw new RuntimeException("delete File" + ff.getName() + " is n't seccess"); } } } public void deleteFtpFile(String fileName) throws IOException { if (!super.deleteFile(ftpUseBean.getFtpPath() +fileName)) throw new RuntimeException("delete File" + ftpUseBean.getFtpPath() +fileName + " is n't seccess"); } public InputStream downFtpFile(String fileName) throws IOException { return super.retrieveFileStream(ftpUseBean.getFtpPath()+fileName); } /** * * @return * @return StringBuffer * @description 下载ftp服务器上的文件,addr为带用户名和密码的URL */ public StringBuffer downloadBufferByURL(String addr) { BufferedReader in = null; try { URL url = new URL(addr); URLConnection conn = url.openConnection(); in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; StringBuffer ret = new StringBuffer(); while ((line = in.readLine()) != null) ret.append(line); return ret; } catch (Exception e) { log.error(e); return null; } finally { try { if (null != in) in.close(); } catch (IOException e) { e.printStackTrace(); log.error(e); } } } /** * * @return * @return byte[] * @description 下载ftp服务器上的文件,addr为带用户名和密码的URL */ public byte[] downloadByteByURL(String addr) { FTPClient ftp = null; try { URL url = new URL(addr); int port = url.getPort()!=-1?url.getPort():21; log.info("HOST:"+url.getHost()); log.info("Port:"+port); log.info("USERINFO:"+url.getUserInfo()); log.info("PATH:"+url.getPath()); ftp = new FTPClient(); ftp.setDataTimeout(30000); ftp.setDefaultTimeout(30000); ftp.setReaderThread(false); ftp.connect(url.getHost(), port); ftp.login(url.getUserInfo().split(":")[0], url.getUserInfo().split(":")[1]); FTPClientConfig conf = new FTPClientConfig("UNIX"); ftp.configure(conf); log.info(ftp.getReplyString()); ftp.enterLocalPassiveMode(); //ftp.enterRemotePassiveMode() ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); int reply = ftp.sendCommand("OPTS UTF8 ON");// try to log.debug("alter to utf-8 encoding - reply:" + reply); if (reply == 200) { // UTF8 Command ftp.setControlEncoding("UTF-8"); } ftp.setFileType(FTPClient.BINARY_FILE_TYPE); log.info(ftp.getReplyString()); ByteArrayOutputStream out=new ByteArrayOutputStream(); DataOutputStream o=new DataOutputStream(out); String remotePath = url.getPath(); /** * Fixed:if doen't remove the first "/" at the head of url, * the file can't be retrieved. */ if(remotePath.indexOf("/")==0) { remotePath = url.getPath().replaceFirst("/", ""); } ftp.retrieveFile(remotePath, o); byte[] ret = out.toByteArray(); o.close(); String filepath = url.getPath(); ftp.changeWorkingDirectory(filepath.substring(0,filepath.lastIndexOf("/"))); files = ftp.listFiles(); return ret; } catch (Exception ex) { log.error("Failed to download file from ["+addr+"]!"+ex); } finally { try { if (null!=ftp) ftp.disconnect(); } catch (Exception e) { // } } return null; // StringBuffer buffer = downloadBufferByURL(addr); // return null == buffer ? null : buffer.toString().getBytes(); } public FTPFile[] getFiles() { return files; } public void setFiles(FTPFile[] files) { this.files = files; } // public static void getftpfilesize(String addr){ // // FTPClient ftp = null; // // try { // // URL url = new URL(addr); // // int port = url.getPort()!=-1?url.getPort():21; // log.info("HOST:"+url.getHost()); // log.info("Port:"+port); // log.info("USERINFO:"+url.getUserInfo()); // log.info("PATH:"+url.getPath()); // // ftp = new FTPClient(); // // ftp.setDataTimeout(30000); // ftp.setDefaultTimeout(30000); // ftp.setReaderThread(false); // ftp.connect(url.getHost(), port); // ftp.login(url.getUserInfo().split(":")[0], url.getUserInfo().split(":")[1]); // FTPClientConfig conf = new FTPClientConfig("UNIX"); // ftp.configure(conf); // log.info(ftp.getReplyString()); // // ftp.enterLocalPassiveMode(); //ftp.enterRemotePassiveMode() // ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); // // int reply = ftp.sendCommand("OPTS UTF8 ON");// try to // // log.debug("alter to utf-8 encoding - reply:" + reply); // if (reply == 200) { // UTF8 Command // ftp.setControlEncoding("UTF-8"); // } // ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // ftp.changeWorkingDirectory(url.getPath()); // FTPFile[] files = ftp.listFiles(); // for (FTPFile flie : files){ // System.out.println(new String(flie.getName().getBytes("gbk"),"ISO8859-1")); // System.out.println(flie.getSize()); // } // // // } catch (Exception ex) { // log.error("Failed to download file from ["+addr+"]!"+ex); // } finally { // try {<pre class="java" name="code"> if (null!=ftp) // ftp.disconnect(); // } catch (Exception e) { } } } }
以上就是JAVA FTPClient工具类的上传和下载的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。