记一次使用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服务器,不用写到本地,本次不涉及文件下载,在上传的过程中有指定的文件夹,如果没有,按照规定去创建。。。