java基于Apache FTP实现文件上传、下载、修改文件名、删除
ApacheFTP是应用比较广泛的FTP上传客户端工具,它易于操作,代码简略,结构清晰,是做FTP文件客户端管理软件的优先之选。FTP的操作包括:FTP文件上传(断点续传)、FTP文件下载、FTP文件重命名、FTP文件删除,这些操作已经将FTP应用管理的方式发挥的淋漓尽致了,So我一直都用此种方式来实现FTP文件服务器的管理工作;下附FTP工具代码。
1、FTP文件操作状态枚举类
packagecom.scengine.wtms.utils.ftp;
publicenumFTPStatus
{
File_Exits(0),Create_Directory_Success(1),Create_Directory_Fail(2),Upload_From_Break_Success(3),Upload_From_Break_Faild(4),Download_From_Break_Success(5),Download_From_Break_Faild(6),Upload_New_File_Success(7),Upload_New_File_Failed(8),Delete_Remote_Success(9),Delete_Remote_Faild(10),Remote_Bigger_Local(11),Remote_smaller_local(12),Not_Exist_File(13),Remote_Rename_Success(14),Remote_Rename_Faild(15),File_Not_Unique(16);
privateintstatus;
publicintgetStatus()
{
returnstatus;
}
publicvoidsetStatus(intstatus)
{
this.status=status;
}
FTPStatus(intstatus)
{
this.status=status;
}
}
2、FTP文件操作工具代码
packagecom.scengine.wtms.utils.ftp;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.io.PrintWriter;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.net.PrintCommandListener;
importorg.apache.commons.net.ftp.FTP;
importorg.apache.commons.net.ftp.FTPClient;
importorg.apache.commons.net.ftp.FTPFile;
importorg.apache.commons.net.ftp.FTPReply;
importcom.scengine.wtms.utils.Log;
publicclassFTPUtils
{
privateFTPClientftpClient=newFTPClient();
/**
*对象构造设置将过程中使用到的命令输出到控制台
*/
publicFTPUtils()
{
this.ftpClient.addProtocolCommandListener(newPrintCommandListener(newPrintWriter(System.out)));
}
/**
*
*java编程中用于连接到FTP服务器
*
*@paramhostname
*主机名
*
*@paramport
*端口
*
*@paramusername
*用户名
*
*@parampassword
*密码
*
*@return是否连接成功
*
*@throwsIOException
*/
publicbooleanconnect(Stringhostname,intport,Stringusername,Stringpassword)throwsIOException
{
ftpClient.connect(hostname,port);
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode()))
{
if(ftpClient.login(username,password))
{
returntrue;
}
}
disconnect();
returnfalse;
}
/**
*删除远程FTP文件
*
*@paramremote
*远程文件路径
*@return
*@throwsIOException
*/
publicFTPStatusdelete(Stringremote)throwsIOException
{
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
FTPStatusresult=null;
FTPFile[]files=ftpClient.listFiles(remote);
if(files.length==1)
{
booleanstatus=ftpClient.deleteFile(remote);
result=status?FTPStatus.Delete_Remote_Success:FTPStatus.Delete_Remote_Faild;
}
else
{
result=FTPStatus.Not_Exist_File;
}
Log.getLogger(this.getClass()).info("FTP服务器文件删除标识:"+result);
returnresult;
}
/**
*重命名远程FTP文件
*
*@paramname
*新远程文件名称(路径-必须保证在同一路径下)
*
*@paramremote
*远程文件路径
*
*@return是否成功
*
*@throwsIOException
*/
publicFTPStatusrename(Stringname,Stringremote)throwsIOException
{
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
FTPStatusresult=null;
FTPFile[]files=ftpClient.listFiles(remote);
if(files.length==1)
{
booleanstatus=ftpClient.rename(remote,name);
result=status?FTPStatus.Remote_Rename_Success:FTPStatus.Remote_Rename_Faild;
}
else
{
result=FTPStatus.Not_Exist_File;
}
Log.getLogger(this.getClass()).info("FTP服务器文件名更新标识:"+result);
returnresult;
}
/**
*
*从FTP服务器上下载文件
*
*@paramfileName
*下载文件的名字(包括后缀名)
*
*@paramremote
*远程文件路径
*
*@paramlocal
*本地文件路径
*
*@return是否成功
*
*@throwsIOException
*/
publicFTPStatusdownload(StringfileName,Stringremote,HttpServletResponseresponse)throwsIOException
{
//开启输出流弹出文件保存路径选择窗口
response.setContentType("application/octet-stream");
response.setContentType("application/OCTET-STREAM;charset=UTF-8");
response.setHeader("Content-Disposition","attachment;filename="+fileName);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
FTPStatusresult;
OutputStreamout=response.getOutputStream();
booleanstatus=ftpClient.retrieveFile(remote,out);
result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild;
Log.getLogger(this.getClass()).info("FTP服务器文件下载标识:"+result);
out.close();
returnresult;
}
/**
*
*从FTP服务器上下载文件
*
*@paramremote
*远程文件路径
*
*@paramlocal
*本地文件路径
*
*@return是否成功
*
*@throwsIOException
*/
@SuppressWarnings("resource")
publicFTPStatusdownload(Stringremote,Stringlocal)throwsIOException
{
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
FTPStatusresult;
Filef=newFile(local);
FTPFile[]files=ftpClient.listFiles(remote);
if(files.length!=1)
{
Log.getLogger(this.getClass()).info("远程文件不唯一");
returnFTPStatus.File_Not_Unique;
}
longlRemoteSize=files[0].getSize();
if(f.exists())
{
OutputStreamout=newFileOutputStream(f,true);
Log.getLogger(this.getClass()).info("本地文件大小为:"+f.length());
if(f.length()>=lRemoteSize)
{
Log.getLogger(this.getClass()).info("本地文件大小大于远程文件大小,下载中止");
returnFTPStatus.Remote_smaller_local;
}
ftpClient.setRestartOffset(f.length());
booleanstatus=ftpClient.retrieveFile(remote,out);
result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild;
out.close();
}else
{
OutputStreamout=newFileOutputStream(f);
booleanstatus=ftpClient.retrieveFile(remote,out);
result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild;
out.close();
}
returnresult;
}
/**
*
*上传文件到FTP服务器,支持断点续传
*
*@paramlocal
*本地文件名称,绝对路径
*
*@paramremote
*远程文件路径,使用/home/directory1/subdirectory/file.ext
*按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构
*
*@return上传结果
*
*@throwsIOException
*/
@SuppressWarnings("resource")
publicFTPStatusupload(Stringlocal,Stringremote)throwsIOException
{
//设置PassiveMode传输
ftpClient.enterLocalPassiveMode();
//设置以二进制流的方式传输
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
FTPStatusresult;
//对远程目录的处理
StringremoteFileName=remote;
if(remote.contains("/"))
{
remoteFileName=remote.substring(remote.lastIndexOf("/")+1);
Stringdirectory=remote.substring(0,remote.lastIndexOf("/")+1);
if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory))
{
//如果远程目录不存在,则递归创建远程服务器目录
intstart=0;
intend=0;
if(directory.startsWith("/"))
{
start=1;
}else
{
start=0;
}
end=directory.indexOf("/",start);
while(true)
{
StringsubDirectory=remote.substring(start,end);
if(!ftpClient.changeWorkingDirectory(subDirectory))
{
if(ftpClient.makeDirectory(subDirectory))
{
ftpClient.changeWorkingDirectory(subDirectory);
}else
{
Log.getLogger(this.getClass()).info("创建目录失败");
returnFTPStatus.Create_Directory_Fail;
}
}
start=end+1;
end=directory.indexOf("/",start);
//检查所有目录是否创建完毕
if(end<=start)
{
break;
}
}
}
}
//检查远程是否存在文件
FTPFile[]files=ftpClient.listFiles(remoteFileName);
if(files.length==1)
{
longremoteSize=files[0].getSize();
Filef=newFile(local);
longlocalSize=f.length();
if(remoteSize==localSize)
{
returnFTPStatus.File_Exits;
}elseif(remoteSize>localSize)
{
returnFTPStatus.Remote_Bigger_Local;
}
//尝试移动文件内读取指针,实现断点续传
InputStreamis=newFileInputStream(f);
if(is.skip(remoteSize)==remoteSize)
{
ftpClient.setRestartOffset(remoteSize);
if(ftpClient.storeFile(remote,is))
{
returnFTPStatus.Upload_From_Break_Success;
}
}
//如果断点续传没有成功,则删除服务器上文件,重新上传
if(!ftpClient.deleteFile(remoteFileName))
{
returnFTPStatus.Delete_Remote_Faild;
}
is=newFileInputStream(f);
if(ftpClient.storeFile(remote,is))
{
result=FTPStatus.Upload_New_File_Success;
}else
{
result=FTPStatus.Upload_New_File_Failed;
}
is.close();
}else
{
InputStreamis=newFileInputStream(local);
if(ftpClient.storeFile(remoteFileName,is))
{
result=FTPStatus.Upload_New_File_Success;
}else
{
result=FTPStatus.Upload_New_File_Failed;
}
is.close();
}
returnresult;
}
/**
*
*断开与远程服务器的连接
*
*@throwsIOException
*/
publicvoiddisconnect()throwsIOException
{
if(ftpClient.isConnected())
{
ftpClient.disconnect();
}
}
publicstaticvoidmain(String[]args)
{
FTPUtilsmyFtp=newFTPUtils();
try
{
myFtp.connect("192.168.1.200",21,"duser","HTPDuserXP32");
Log.getLogger(FTPUtils.class).info(myFtp.upload("C:\\Users\\Administrator\\Desktop\\swing.drawer.jar","/jars/swing.drawer.jar"));
myFtp.disconnect();
}catch(IOExceptione)
{
Log.getLogger(FTPUtils.class).info("FTP上传文件异常:"+e.getMessage());
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。