最近的一个项目跟ftp打交道很多,经常需要向ftp上传、下载文件,现在总结一下公共方法。
上传
/*** 文件上传
*
*@paramip
* host
*@paramport
* 端口
*@paramuserName
* 用户名
*@parampassWord
* 密码
*@paramlocalpath
* 上传文件在本地磁盘路径
*@paramfileName
* 文件名
*@paramremotePath
* 文件要上传到ftp服务器的路径
*@throwsException*/
public static Boolean fileFtpUpload(String ip, intport, String userName,
String passWord, String localpath, String fileName,
String remotePath)throwsException {
FTPClient ftp= new FTPClient();//创建客户端对象
InputStream local = null;boolean flag = false;try{
checkIsExsitFile(localpath, fileName);//判断本地路径下有无该文件
SocketAddress address = newInetSocketAddress(ip, port);
ftp.connect(ip, port);//连接
ftp.login(userName, passWord);//登录
log.info("ftp服务器连接、登陆成功,地址为:" +address);//检查上传路径是否存在 如果不存在返回false
boolean flag1 =ftp.changeWorkingDirectory(remotePath);if (!flag1) {//创建上传的路径 该方法只能创建一级目录,在这里如果/home/ftpuser存在则可创建image//ftp.makeDirectory(path);
throw new Exception("ftp服务器上没有指定文件目录,请先创建:" +remotePath);
}//指定上传路径
ftp.changeWorkingDirectory(remotePath);//指定上传文件的类型 二进制文件
ftp.setFileType(FTP.BINARY_FILE_TYPE);//读取本地文件
File file = new File(localpath + "\\" +fileName);
local= newFileInputStream(file);//第一个参数是文件名
ftp.storeFile(file.getName(), local);
log.info("上传成功");
flag= true;
}catch(SocketException e) {
log.info("上传失败" +e);
flag= false;
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally{try{//关闭文件流
local.close();//退出
ftp.logout();//断开连接
ftp.disconnect();
}catch(IOException e) {
e.printStackTrace();
}
}returnflag;
}
上传文件之前需要先判断磁盘下有无指定文件,判断方法如下:
/**
* 判断文件路径下有无指定文件
*
* @param filePath
* 生成文件名称
* @param fileName
* 文件名称
* @return 是否创建成功,成功则返回true
*/
public static void checkIsExsitFile(String filePath, String fileName) {
File dirFile = new File(filePath);// 文件夹对象
try {
File[] files = dirFile.listFiles();
Boolean bl = false;
for (File file1 : files) {
if (fileName.equals(file1.getName())) {
bl = true;
break;
}
}
// 如果文件夹内文件不存在,则报错
if (!bl) {
throw new Exception("文件路径下没有指定上传文件");
}
} catch (Exception e) {
e.printStackTrace();
}
}
注意在上传之前一定要先切换到当前目录,即这一行
// 指定上传路径
ftp.changeWorkingDirectory(remotePath);
同时需要指定上传文件的类型
// 指定上传文件的类型 二进制文件
ftp.setFileType(FTP.BINARY_FILE_TYPE);
下载
/*** ftp下载文件
*
*@paramip
*@paramport
*@paramuserName
*@parampassWord
*@paramlocalPath
*@paramremotePath
*@paramfileContainsName
* 文件包含名
*@return*@throwsException*/
public static String fileFtpDown(String ip, intport, String userName,
String passWord, String localPath, String remotePath,
String fileContainsName)throwsException {
FTPClient ftpClient= new FTPClient();//创建客户端对象
String fileName = "";
SocketAddress address= newInetSocketAddress(ip, port);
ftpClient.connect(ip, port);//连接
boolean login = ftpClient.login(userName, passWord);//登陆
if(login) {try{
log.info("ftp服务器连接、登陆成功,地址为:" +address);
ftpClient.enterLocalPassiveMode();//开通一个端口来传输数据
FTPFile[] fs = ftpClient.listFiles(remotePath);//fs为remoteFile下所有文件集合
for(FTPFile ff : fs) {
String f= new String(ff.getName().getBytes("iso-8859-1"),"utf-8");if (f.contains(fileContainsName)) {//文件名称不确定时用contains
File localFile = new File(localPath + "\\" + f); //在本地指定路径创建了一个对象
OutputStream is = newFileOutputStream(localFile);
ftpClient.changeWorkingDirectory(remotePath);//设置下载文件相对远程FTP根目录所处的路径
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); //开始下载文件前设置传输类型
ftpClient.retrieveFile(ff.getName(), is);
is.close();
fileName=f;
}break;
}
}catch(IOException e) {
e.printStackTrace();
}finally{if(ftpClient.isConnected()) {try{
ftpClient.disconnect();
}catch(IOException ioe) {
}
}
}
}else{
log.info("ftp服务器连接、登陆失败");
}returnfileName;
}