package com.ego.commons.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
/**
* 使用FTPClient技术实现文件的上传
* @author DZT
*
*/
public class FTPUtil {
/**
* Description:向FTP服务器上传文件信息
*
* 各种参数信息:
* @param host FTP的服务器的hostname
*
* @param port FTP的服务器的端口号
*
* @param username FTP的服务器的登录账号
*
* @param password FTP的服务器的登录密码
*
* @param basePath FTP的服务器的根目录
*
* @param filePath FTP的服务器的文件存放的路径,比如:/2017/03/04,文件的路径为basePath+filePath
*
* @param fileName FTP的服务器的文件存储的名称。
*
* @param inputStream 文件上传的输入流
*
*
* @return 上传成功返回true ,上传失败返回false
*
*
*/
public static boolean uploadFile(String host,int port,String username,String password,String basePath,String filePath
,String fileName,InputStream inputStream){
boolean result=false;
//开启客户端
FTPClient ftp=new FTPClient();
//传输的字符串编码(防止乱码)
ftp.setControlEncoding("UTF-8");
//超时时间(防止FTP僵死)
ftp.setConnectTimeout(1000*60);
ftp.setDataTimeout(1000*60);
ftp.setDefaultTimeout(1000*60);
//设置工作流的大小
ftp.setBufferSize(1024*4);
//主被动模式(应对FTP服务器的相关安全问题进行设置)
ftp.enterLocalActiveMode();
//连接FTP服务器
try{
int reply;
//连接ftp服务器
ftp.connect(host, port);
//如果采用默认端口,可以直接使用connect(port)来连接
//登录FTP服务器
ftp.login(username, password);
//返回一个登录的状态码
reply=ftp.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
ftp.disconnect();
System.out.println("FTP server refused connection...");
return result;
}
//登录成功后切换工作目录
//切换到基础目录
if(!ftp.changeWorkingDirectory(basePath)){
//创建基础目录
if(!ftp.makeDirectory(basePath)){
return result;
}else{
//切换到基础目录
ftp.changeWorkingDirectory(basePath);
}
}
//切换到上传目录
if(!ftp.changeWorkingDirectory(basePath+filePath)){
//如果目录不存在创建目录
String[] dirs=filePath.split("/");
for(String dir:dirs){
if(dir==null||"".equals(dir)){
continue;
}
if(!ftp.changeWorkingDirectory(dir)){
if(!ftp.makeDirectory(dir)){
return result;
}else{
ftp.changeWorkingDirectory(dir);
}
}
}
}
//设置上传的文件类型为二进制
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
if(!ftp.storeFile(fileName,inputStream)){
//上传失败
return result;
}
//上传成功
ftp.logout();
result=true;
}catch(Exception e){
e.printStackTrace();
}finally{
if(ftp.isConnected()){
try {
//ftp.isConnected最好写在finally中,不要直接写在ftp.logout()
//后面,因为ftp.logout也会抛出IOException异常,
//造成结果:ftp退出异常,连接没有释放,积少成多,慢慢阻塞FTP的连接最终引发连接异常
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
}