1、下载相应的jar包
commons-net-3.1.jar
2、实现代码如下:
强调内容在配置文件中config.properties加port、ip、username、password
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UploadWorkOrderFile {
/**
* 日志记录
*/
private final Logger logger = LoggerFactory.getLogger(UploadWorkOrderFile.class);
private static UploadWorkOrderFile ftpUtils;
private FTPClient ftpClient;
// ip地址
private String ip;
// 服务器端口
private String port;
// 用户登录名
private String username;
// 用户登录密码
private String password;
// 文件下载输入流
private InputStream is;
/**
* 私有构造方法
*/
private UploadWorkOrderFile() {
initConfig();
if (null == ftpClient) {
ftpClient = new FTPClient();
}
}
/**
* @title getInstance
* @Description: 获取FTPUtils对象实例
* @return FTPUtils对象实例
*/
public synchronized static UploadWorkOrderFile getInstance() {
if (null == ftpUtils) {
ftpUtils = new UploadWorkOrderFile();
}
return ftpUtils;
}
/**
* @title initConfig
* @Description: 初始化FTP服务器连接属性
*/
public void initConfig() {
// 构造Properties对象
Properties properties = new Properties();
// 定义配置文件输入流
InputStream is = null;
try {
// 获取配置文件输入流
is = UploadWorkOrderFile.class.getResourceAsStream("/config.properties");
// 加载配置文件
properties.load(is);
// 读取配置文件
port = (String) properties.get("port");
// 设置用户名
username = (String) properties.get("username");
// 设置密码
password = (String) properties.get("password");
ip = (String) properties.get("ip");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 判断输入流是否为空
if (null != is) {
try {
// 关闭输入流
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* @title connectToTheServer
* @Description: 连接(配置通用连接属性)至服务器
* @return boolean
*/
public boolean connectToTheServer() {
// 定义返回值
boolean result = false;
try {
// 连接至服务器,端口默认为21时,可直接通过URL连接
ftpClient.connect(ip, Integer.parseInt(port));
// 登录服务器
ftpClient.login(username, password);
// 判断返回码是否合法
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
// 不合法时断开连接
ftpClient.disconnect();
// 结束程序
return result;
}
// 设置文件操作目录(即上传文件存放的文件夹)
result = ftpClient.changeWorkingDirectory(Constants.ALARM_FORWARD_UPLOAD);
// 设置文件类型,二进制
result = ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 设置缓冲区大小
ftpClient.setBufferSize(3072);//3072
// 设置字符编码
//ftpClient.setControlEncoding("UTF-8");
} catch (IOException e) {
logger.error("转工单上传文件连接服务器失败:{}", e);
}
return result;
}
/**
* @title storeFile
* @Description:上传文件至FTP服务器
* @param storePath 上传文件存储路径(ip)
* @param fileName 上传文件存储名称
* @param is 上传文件输入流
* @return boolean
*/
public boolean storeFile(String fileName, InputStream is) {
boolean result = false;
try {
// 连接至服务器
result = connectToTheServer();
// 判断服务器是否连接成功
if (result) {
// 上传文件
ftpClient.enterLocalPassiveMode();
result = ftpClient.storeFile(new String(fileName.getBytes("GBK"),"iso-8859-1"), is);
}
// 关闭输入流
is.close();
} catch (IOException e) {
logger.error("转工单上传文件失败:{}", e);
} finally {
// 判断输入流是否存在
if (null != is) {
try {
// 关闭输入流
is.close();
} catch (IOException e) {
logger.error("转工单上传文件关闭输入流失败:{}", e);
}
}
// 登出服务器并断开连接
ftpUtils.logout();
}
//System.out.println(result);
return result;
}
/**
* @Description:登出服务器并断开连接
* @return boolean
*/
public boolean logout() {
boolean result = false;
if (null != is) {
try {
// 关闭输入流
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != ftpClient) {
try {
// 登出服务器
result = ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 判断连接是否存在
if (ftpClient.isConnected()) {
try {
// 断开连接
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return result;
}
}
3、调用如下:
filePathAndName 文件的绝对路径
buffer 文件名称
InputStream in = new FileInputStream(new File(filePathAndName));
boolean result = UploadWorkOrderFile.getInstance().storeFile(buffer.toString(), in);
若result为true则上传成功。