欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

公用ftp工具组件

程序员文章站 2022-05-30 12:01:14
...

代码:

FtpTool

package com.wirelesscity.tools.ftp;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import com.wirelesscity.common.StringUtil;

import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;

@SuppressWarnings("restriction")
public class FtpTool {

	private FtpClient ftpclient;
	private String ipAddress; // FTP地址
	private int ipPort; // 端口
	private String userName; // 用户名
	private String PassWord; // 密码

	/**
	 * 初始化参数FTPTOOL对象
	 * @param ipAddress
	 * @param ipPort
	 * @param userName
	 * @param PassWord
	 * @throws IOException
	 */
	public FtpTool(String ip, int port, String username, String password)
			throws IOException {
		ipAddress = new String(ip);
		ipPort = port;
		if (StringUtil.isEmpty(String.valueOf(port))) {
			port = 21;
		}
		ftpclient = new FtpClient(ipAddress, ipPort);
		userName = new String(username);
		PassWord = new String(password);
	}

	/**
	 * 登录FTP服务器
	 * 
	 * @throws Exception
	 */
	public void login() throws Exception {
		ftpclient.login(userName, PassWord);
	}

	/**
	 * 退出FTP服务器
	 * 
	 * @throws Exception
	 */
	public void logout() throws Exception {
		// 用ftpclient.closeServer()断开FTP出错时用下更语句退出
		ftpclient.sendServer("QUIT\r\n");
		int reply = ftpclient.readServerResponse(); // 取得服务器的返回信息
		System.out.println("reply:" + reply);
	}

	/**
	 * 在FTP服务器上建立指定的目录,当目录已经存在的情下不会影响目录下的文件,这样用以判断FTP
	 * 上传文件时保证目录的存在目录格式必须以"/"根目录开头
	 * 
	 * @param pathList
	 *            String
	 * @throws Exception
	 */
	public void buildList(String pathList) throws Exception {
		ftpclient.ascii();
		StringTokenizer s = new StringTokenizer(pathList, "/"); // sign
		int count = s.countTokens();
		String pathName = "";
		while (s.hasMoreElements()) {
			pathName = pathName + "/" + (String) s.nextElement();
			try {
				ftpclient.sendServer("XMKD " + pathName + "\r\n");
			} catch (Exception e) {
				e = null;
			}
			int reply = ftpclient.readServerResponse();
		}
		ftpclient.binary();
	}

	/**
	 * 取得指定目录下的所有文件名,不包括目录名称 分析nameList得到的输入流中的数,得到指定目录下的所有文件名
	 * 
	 * @param fullPath
	 *            String
	 * @return ArrayList
	 * @throws Exception
	 */
	public ArrayList fileNames(String fullPath) throws Exception {
		ftpclient.ascii(); // 注意,使用字符模式
		TelnetInputStream list = ftpclient.nameList(fullPath);
		byte[] names = new byte[2048];
		int bufsize = 0;
		bufsize = list.read(names, 0, names.length); // 从流中读取
		list.close();
		ArrayList namesList = new ArrayList();
		int i = 0;
		int j = 0;
		while (i < bufsize) {
			if (names[i] == 10) { // 字符模式为10,二进制模式为13
				// 文件名在数据中开始下标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1
				String tempName = new String(names, j, i - j);
				namesList.add(tempName);
				j = i + 1; // 上一次位置字符模式
			}
			i = i + 1;
		}
		return namesList;
	}

	/**
	 * 上传文件到FTP服务器,destination路径以FTP服务器的"/"开始,带文件名、 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖
	 * 
	 * @param source
	 *            String
	 * @param destination
	 *            String
	 * @throws Exception
	 */
	public void upFile(String source, String destination) throws Exception {
		buildList(destination.substring(0, destination.lastIndexOf("/")));
		ftpclient.binary(); // 此行代码必须放在buildList之后
		TelnetOutputStream ftpOut = ftpclient.put(destination);
		TelnetInputStream ftpIn = new TelnetInputStream(new FileInputStream(
				source), true);
		byte[] buf = new byte[204800];
		int bufsize = 0;
		while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
			ftpOut.write(buf, 0, bufsize);
		}
		ftpIn.close();
		ftpOut.close();

	}

	/**
	 * JSP中的流上传到FTP服务器, 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖 字节数组做为文件的输入流,此方法适用于JSP中通过
	 * request输入流来直接上传文件在RequestUpload类中调用了此方法, destination路径以FTP服务器的"/"开始,带文件名
	 * 
	 * @param sourceData
	 *            byte[]
	 * @param destination
	 *            String
	 * @throws Exception
	 */
	public void upFile(byte[] sourceData, String destination) throws Exception {
		buildList(destination.substring(0, destination.lastIndexOf("/")));
		ftpclient.binary(); // 此行代码必须放在buildList之后
		TelnetOutputStream ftpOut = ftpclient.put(destination);
		ftpOut.write(sourceData, 0, sourceData.length);
		// ftpOut.flush();
		ftpOut.close();
	}

	/**
	 * 从FTP文件服务器上下载文件SourceFileName,到本地destinationFileName 所有的文件名中都要求包括完整的路径名在内
	 * 
	 * @param SourceFileName
	 *            String
	 * @param destinationFileName
	 *            String
	 * @throws Exception
	 */
	public void downFile(String SourceFileName, String destinationFileName)
			throws Exception {
		ftpclient.binary(); // 一定要使用二进制模式
		TelnetInputStream ftpIn = ftpclient.get(SourceFileName);
		byte[] buf = new byte[204800];
		int bufsize = 0;
		FileOutputStream ftpOut = new FileOutputStream(destinationFileName);
		while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
			ftpOut.write(buf, 0, bufsize);
		}
		ftpOut.close();
		ftpIn.close();
	}

	/**
	 * 从FTP文件服务器上下载文件,输出到字节数组中
	 * 
	 * @param SourceFileName
	 *            String
	 * @return byte[]
	 * @throws Exception
	 */
	public byte[] downFile(String SourceFileName) throws Exception {
		ftpclient.binary(); // 一定要使用二进制模式
		TelnetInputStream ftpIn = ftpclient.get(SourceFileName);
		ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
		byte[] buf = new byte[204800];
		int bufsize = 0;

		while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
			byteOut.write(buf, 0, bufsize);
		}
		byte[] return_arraybyte = byteOut.toByteArray();
		byteOut.close();
		ftpIn.close();
		return return_arraybyte;
	}

}
FtpServiceImpl

package com.wirelesscity.tools.ftp;

import java.io.IOException;

public class FtpServiceImpl implements FtpService{
	
	private String ftpIpAddress;
	private int ftpPort;
	private String ftpUserName;
	private String ftpPassword;
	
	//FTP路径配置
	private String ftpLocalPathRoot;
	private String ftpRemotePathRoot;
	
	public String getFtpLocalPathRoot() {
		return ftpLocalPathRoot;
	}

	public void setFtpLocalPathRoot(String ftpLocalPathRoot) {
		this.ftpLocalPathRoot = ftpLocalPathRoot;
	}

	public String getFtpRemotePathRoot() {
		return ftpRemotePathRoot;
	}

	public void setFtpRemotePathRoot(String ftpRemotePathRoot) {
		this.ftpRemotePathRoot = ftpRemotePathRoot;
	}

	public void setFtpIpAddress(String ftpIpAddress) {
		this.ftpIpAddress = ftpIpAddress;
	}

	public void setFtpPort(int ftpPort) {
		this.ftpPort = ftpPort;
	}

	public void setFtpUserName(String ftpUserName) {
		this.ftpUserName = ftpUserName;
	}

	public void setFtpPassword(String ftpPassword) {
		this.ftpPassword = ftpPassword;
	}
	
	public String getFtpIpAddress() {
		return ftpIpAddress;
	}

	public int getFtpPort() {
		return ftpPort;
	}

	public String getFtpUserName() {
		return ftpUserName;
	}

	public String getFtpPassword() {
		return ftpPassword;
	}
	
	public void testUpload(){
		// TODO Auto-generated method stub
		try {
			FtpTool ftpTool = new FtpTool(this.getFtpIpAddress(),
					this.getFtpPort(), this.getFtpUserName(),
					this.getFtpPassword());
			ftpTool.login();
			ftpTool.buildList("file/user/tttt");

			String source = "D:/config.rar";
			String destination = "/file/user/tttt/test.jar";
			ftpTool.upFile(source, destination);
			ftpTool.logout();

		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 建立文件夹路径
	 * @param pathList
	 * @throws Exception
	 */
	public void buildList(String pathList) throws Exception{
		FtpTool ftpTool = new FtpTool(this.getFtpIpAddress(),
				this.getFtpPort(), this.getFtpUserName(),
				this.getFtpPassword());
		ftpTool.login();
		ftpTool.buildList(pathList);
		ftpTool.logout();
	}
	
	
	/**
	 * 上传文件到FTP服务器,
	 * destination路径以FTP服务器的"/"开始,
	 * 带文件名、 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖
	 * @param source
	 *            String
	 * @param destination
	 *            String
	 * @throws Exception
	 */
	public void upFile(String source, String destination) throws Exception{
		FtpTool ftpTool = new FtpTool(this.getFtpIpAddress(),
				this.getFtpPort(), this.getFtpUserName(),
				this.getFtpPassword());
		ftpTool.login();
		ftpTool.upFile(source, destination);
		ftpTool.logout();
	}
	
	
	/**
	 * JSP中的流上传到FTP服务器, 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖 字节数组做为文件的输入流,此
	 * 方法适用于JSP中通过
	 * request输入流来直接上传文件在RequestUpload类中调用了此方法, 
	 * destination路径以FTP服务器的"/"开始,带文件名
	 * @param sourceData
	 *            byte[]
	 * @param destination
	 *            String
	 * @throws Exception
	 */
	public void upFile(byte[] sourceData, String destination) throws Exception {
		FtpTool ftpTool = new FtpTool(this.getFtpIpAddress(),
				this.getFtpPort(), this.getFtpUserName(),
				this.getFtpPassword());
		ftpTool.login();
		ftpTool.upFile(sourceData, destination);
		ftpTool.logout();
	}
	
	

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		FtpServiceImpl ftpUtil=new FtpServiceImpl();
		ftpUtil.testUpload();

	}

}
FtpService:

package com.wirelesscity.tools.ftp;

public interface FtpService{
	
	public String getFtpLocalPathRoot() ;
	
	public String getFtpRemotePathRoot();
	
	public void testUpload();
	
	/**
	 * 建立文件夹路径
	 * @param pathList
	 * @throws Exception
	 */
	public void buildList(String pathList) throws Exception;
	
	/**
	 * 上传文件到FTP服务器,
	 * destination路径以FTP服务器的"/"开始,
	 * 带文件名、 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖
	 * @param source
	 *            String
	 * @param destination
	 *            String
	 * @throws Exception
	 */
	public void upFile(String source, String destination) throws Exception;
	
	
	/**
	 * JSP中的流上传到FTP服务器, 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖 字节数组做为文件的输入流,此
	 * 方法适用于JSP中通过
	 * request输入流来直接上传文件在RequestUpload类中调用了此方法, 
	 * destination路径以FTP服务器的"/"开始,带文件名
	 * @param sourceData
	 *            byte[]
	 * @param destination
	 *            String
	 * @throws Exception
	 */
	public void upFile(byte[] sourceData, String destination) throws Exception ;
	
	

}