记一次使用FTP服务器上传文件。。。

记一次使用FTP服务器上传文件。。。

过程中遇到的问题:FTP服务器传入入参IP的时候是不需要加前缀的,上传文件有时候需要设置被动模式**ftpClient.enterLocalPassiveMode();//被动模式**

package *************;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

public class FTPUtils {

private static final Logger log = LogManager.getLogger(FTPUtils.class);

/**
 * FTP客户端
 */
private static FTPClient ftpClient;

/**
 * 获取FTPClient对象
 * @return
 */
public static FTPClient getConnectionFTP(){
	
	// 创建FTPClient对象
	ftpClient = new FTPClient();
	
	try {
		//连接FTP服务器
		ftpClient.connect(IP,PORT);
		ftpClient.setControlEncoding("UTF-8");
		FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
        conf.setServerLanguageCode("zh");
        //登陆FTP服务器
        ftpClient.login(USER, PWD);
        if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
        	log.info("未连接到FTP,用户名或密码错误。");
        	ftpClient.disconnect();
		}else {
			log.info("FTP连接成功。");
			ftpClient.changeWorkingDirectory(PATH);//进入服务器根目录
		}
	} catch (SocketException e) {
		e.printStackTrace();
		log.info("FTP的IP地址可能错误,请正确配置。");
	} catch (IOException e) {
		e.printStackTrace();
		log.info("FTP的端口错误,请正确配置。");
	}
	
	return ftpClient;
}

/**
 * 创建一个目录
 * @param dirName 想要创建的文件夹名
 */
public static void makeDirectory(String dirName){
	
	boolean flag = true;
	try {
		flag = ftpClient.makeDirectory(dirName);
		if (flag) {
			log.info("创建文件夹"+dirName+"成功");
		}else {
			log.info("创建文件夹"+dirName+"失败");
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}

/**
 * 改变目录路径
 * @param directory
 * @return
 */
public static boolean changeWorkingDirectory(String directory) {
	
	boolean flag = true;
	try {
		flag = ftpClient.changeWorkingDirectory(directory);
		if (flag) {
			log.info("进入文件夹" + directory +"成功");
		}else {
			log.info("进入文件夹" + directory +"失败");
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
	
	return flag;
}
	
/**
 * 上传文件	
 * @param content
 * @param remoteFile
 */
public static boolean uploadJT(String content,String remoteFile){
	
	ftpClient = FTPUtils.getConnectionFTP();
	log.info("连接远程服务器");
	SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
	SimpleDateFormat sdfMonth = new SimpleDateFormat("MM");
	Date date = new Date();
	String dirParent = sdfYear.format(date); 
	String dirSon = sdfMonth.format(date);
	InputStream input = null;
	try {
		input = new ByteArrayInputStream(content.getBytes("UTF-8"));
		if (FTPUtils.changeWorkingDirectory(dirParent) == false) {
			makeDirectory(dirParent);
		}
		ftpClient.changeWorkingDirectory(dirParent);
		if (FTPUtils.changeWorkingDirectory(dirSon) == false) {
			makeDirectory(dirSon);
		}
		ftpClient.changeWorkingDirectory(dirSon);
		
		ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
		ftpClient.enterLocalPassiveMode();//被动模式
		boolean flag = ftpClient.storeFile(remoteFile, input);
		if(flag){
			log.info(remoteFile+"文件上传成功!");
			return true;
		}else{
			log.info(remoteFile+"文件上传失败!");
			return false;
		}
	} catch (IOException e) {
		e.printStackTrace();
		log.info("文件上传失败");
		return false;
	}finally {
		//关闭ftp服务器
		if (ftpClient.isConnected()) {
			try {
				ftpClient.disconnect();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if (input != null) {
			try {
				input.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

/**
 * 断开FTP的连接
 * @param ftpClient
 * @return
 */
public static boolean disConnectFTP(FTPClient ftpClient){
	
	boolean flag = false;
	if (ftpClient.isConnected()) {
		try {
			ftpClient.disconnect();
			log.info("断开ftp服务器成功");
			flag = true;
		} catch (IOException e) {
			e.printStackTrace();
			log.info("断开ftp服务器失败");
		}
	}
	return flag;
}

}

代码解释:编辑好文件数据后直接上传到FTP服务器,不用写到本地,本次不涉及文件下载,在上传的过程中有指定的文件夹,如果没有,按照规定去创建。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值