现在的位置: 首页 > 综合 > 正文

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

2018年05月24日 ⁄ 综合 ⁄ 共 8129字 ⁄ 字号 评论关闭

在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 {
			if (null!=ftp)
//			ftp.disconnect();
 //			 } catch (Exception e) {
}
}
}
}

抱歉!评论已关闭.