JAVA中使用FTPClient工具类上传下载

来源:互联网 发布:java web ftp下载文件 编辑:程序博客网 时间:2024/04/24 06:15


在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;//获取目标路径下的文件属性信息,主要是获取文件的sizeprivate 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 ...");elselog.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 Commandsuper.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 tolog.debug("alter to utf-8 encoding - reply:" + reply);if (reply == 200) { // UTF8 Commandftp.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 {
if (null!=ftp)//ftp.disconnect(); // } catch (Exception e) {}}}}
	
				
		
原创粉丝点击