为了实现大文件上传,采用了FTP上传的模式,与百度的UEditor结合使用,支持文件的批量上传,但是实现后,发现单个上传文件没问题,选择批量上传总有部分文件上传失败。经过排查终于发现问题,是创建FTP连接的问题,问题代码如下:
//FTPUtils类成员变量
public static FTPClient ftpClient = null;
private transient static Logger log = LoggerFactory.getLogger(FtpUtils.class);
//获取ftp连接方法
public static void initFtpClient() throws Exception {
int port = 21;
String host = ScanUtil.queryCszByCsbh("FTP_HOST");//获取主机方法
String portStr = ScanUtil.queryCszByCsbh("FTP_PORT");//获取端口方法
String username = ScanUtil.queryCszByCsbh("FTP_USERNAME");//获取ftp用户名
String password = ScanUtil.queryCszByCsbh("FTP_PASSWORD");//获取ftp密码
ftpClient = new FTPClient();
ftpClient.setControlEncoding("utf-8");
try {
if (null != portStr && !"".equals(portStr)) {
port = Integer.valueOf(portStr);
}
ftpClient.connect(host, port); // 连接ftp服务器
ftpClient.login(username, password); // 登录ftp服务器
int replyCode = ftpClient.getReplyCode(); // 是否成功登录服务器
if (!FTPReply.isPositiveCompletion(replyCode)) {
ftpClient.disconnect();
log.info("ftp服务器连接失败:" + host + ":" + port);
} else {
log.info("ftp服务器连接成功:" + host + ":" + port);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
该段代码也是网上copy的问题在于静态成员变量ftpClient,每次上传都会更新该成员变量,该类上传、下载、删除、一级创建ftp文件夹等都用该成员变量。后改为所有的上传、下载、删除等自己获取FTPClient对象,不在使用成员变量的方式,每次操作,都单独获取一次该对象,代码如下:
//获取FTP连接对象
public static FTPClient getFtpCilent() throws Exception {
int port = 21;
String host = ScanUtil.queryCszByCsbh("FTP_HOST");
String portStr = ScanUtil.queryCszByCsbh("FTP_PORT");
String username = ScanUtil.queryCszByCsbh("FTP_USERNAME");
String password = ScanUtil.queryCszByCsbh("FTP_PASSWORD");
FTPClient ftpClient = new FTPClient();
try {
ftpClient.setControlEncoding("utf-8");
if (null != portStr && !"".equals(portStr)) {
port = Integer.valueOf(portStr);
}
ftpClient.connect(host, port); // 连接FTP服务器
ftpClient.login(username, password); // 登录FTP服务器
int replyCode = ftpClient.getReplyCode(); // 是否成功登录服务器
if (!FTPReply.isPositiveCompletion(replyCode)) {
ftpClient.disconnect();
log.info("ftp服务器连接失败:" + host + ":" + port);
} else {
log.info("ftp服务器连接成功:" + host + ":" + port);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return ftpClient;
}
/**
* 上传文件
*
* @param pathname
* ftp服务保存地址
* @param fileName
* 上传到ftp的文件名
* @param inputStream
* 输入文件流
* @return
*/
public static boolean uploadFile(String pathname, String fileName,
InputStream inputStream)throws Exception {
boolean flag = false;
FTPClient ftpClient = null;
try {
ftpClient=getFtpCilent();
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
// 创建目录
createDirecroty(ftpClient,pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.storeFile(fileName, inputStream);
// 关闭退出登录
inputStream.close();
flag = true;
} catch (Exception e) {
log.info("上传文件失败!");
e.printStackTrace();
} finally {
if (null != inputStream) {
inputStream.close();
}
if (null != ftpClient) {
ftpClient.disconnect();
}
}
return flag;
}