Java 实现FTP服务实例详解
Java实现FTP服务实例详解
1、FTP简介
FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
2、实例
2.1、添加依赖
commons-fileupload commons-fileupload
2.2测试类
packagetestController;
importorg.apache.commons.net.ftp.FTP;
importorg.apache.commons.net.ftp.FTPClient;
importorg.chenzhengyou.common.util.FtpUtil;
importorg.junit.Test;
importjava.io.File;
importjava.io.FileInputStream;
/**
*@auther陈郑游
*@create2016-11-23-19:27
*@功能描述图片测试
*@公司地址
*/
publicclassFtpController{
//主机地址端口号
privateStringHOSTNAME="127.0.0.1";
privateIntegerPORT=21;
//本地图片路径
privateStringFilePackage="F:\\Programming_Package\\IMG_3733_1.JPG";
//用户名密码
privateStringUSERNAME="czy";
privateStringPASSWORD="czy";
/**
*无工具类图片测试
**/
@Test
publicvoidtestFtp()throwsException{
//创建一个FtpClient对象
FTPClientftpClient=newFTPClient();
//创建ftp连接。默认是21端口
ftpClient.connect(HOSTNAME,PORT);
//登录ftp服务器,使用用户名和密码
ftpClient.login(USERNAME,PASSWORD);
//上传文件。
//读取本地文件
FileInputStreaminputStream=newFileInputStream(newFile(FilePackage));
//设置上传的路径
ftpClient.changeWorkingDirectory("/myftp/images");
//修改上传文件的格式
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//第一个参数:服务器端文档名
//第二个参数:上传文档的inputStream
ftpClient.storeFile("hello.jpg",inputStream);
//关闭连接
ftpClient.logout();
}
}
2.3、FTP工具类上传图片
工具类
packageorg.chenzhengyou.common.util;
importorg.apache.commons.net.ftp.FTP;
importorg.apache.commons.net.ftp.FTPClient;
importorg.apache.commons.net.ftp.FTPFile;
importorg.apache.commons.net.ftp.FTPReply;
importjava.io.*;
/**
*@auther陈郑游
*@create2016-11-23-19:27
*@功能描述ftp工具类
*@公司地址
*/
publicclassFtpUtil{
/**
*Description:向FTP服务器上传文件
*@paramhostFTP服务器hostname
*@paramportFTP服务器端口
*@paramusernameFTP登录账号
*@parampasswordFTP登录密码
*@parambasePathFTP服务器基础目录
*@paramfilePathFTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
*@paramfilename上传到FTP服务器上的文件名
*@paraminput输入流
*@return成功返回true,否则返回false
*/
publicstaticbooleanuploadFile(Stringhost,intport,Stringusername,
Stringpassword,StringbasePath,
StringfilePath,Stringfilename,InputStreaminput){
booleanresult=false;
FTPClientftp=newFTPClient();
try{
intreply;
ftp.connect(host,port);//连接FTP服务器
//如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username,password);//登录
reply=ftp.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
ftp.disconnect();
returnresult;
}
//切换到上传目录
if(!ftp.changeWorkingDirectory(basePath+filePath)){
//如果目录不存在创建目录
String[]dirs=filePath.split("/");
StringtempPath=basePath;
for(Stringdir:dirs){
if(null==dir||"".equals(dir))continue;
tempPath+="/"+dir;
if(!ftp.changeWorkingDirectory(tempPath)){
if(!ftp.makeDirectory(tempPath)){
returnresult;
}else{
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
if(!ftp.storeFile(filename,input)){
returnresult;
}
input.close();
ftp.logout();
result=true;
}catch(IOExceptione){
e.printStackTrace();
}finally{
if(ftp.isConnected()){
try{
ftp.disconnect();
}catch(IOExceptionioe){
}
}
}
returnresult;
}
/**
*Description:从FTP服务器下载文件
*@paramhostFTP服务器hostname
*@paramportFTP服务器端口
*@paramusernameFTP登录账号
*@parampasswordFTP登录密码
*@paramremotePathFTP服务器上的相对路径
*@paramfileName要下载的文件名
*@paramlocalPath下载后保存到本地的路径
*@return
*/
publicstaticbooleandownloadFile(Stringhost,intport,Stringusername,Stringpassword,StringremotePath,
StringfileName,StringlocalPath){
booleanresult=false;
FTPClientftp=newFTPClient();
try{
intreply;
ftp.connect(host,port);
//如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username,password);//登录
reply=ftp.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
ftp.disconnect();
returnresult;
}
ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
FTPFile[]fs=ftp.listFiles();
for(FTPFileff:fs){
if(ff.getName().equals(fileName)){
FilelocalFile=newFile(localPath+"/"+ff.getName());
OutputStreamis=newFileOutputStream(localFile);
ftp.retrieveFile(ff.getName(),is);
is.close();
}
}
ftp.logout();
result=true;
}catch(IOExceptione){
e.printStackTrace();
}finally{
if(ftp.isConnected()){
try{
ftp.disconnect();
}catch(IOExceptionioe){
}
}
}
returnresult;
}
}
实现类
packagetestController;
importorg.apache.commons.net.ftp.FTP;
importorg.apache.commons.net.ftp.FTPClient;
importorg.chenzhengyou.common.util.FtpUtil;
importorg.junit.Test;
importjava.io.File;
importjava.io.FileInputStream;
/**
*@auther陈郑游
*@create2016-11-23-19:27
*@功能描述图片测试
*@公司地址
*/
publicclassFtpController{
//主机地址端口号
privateStringHOSTNAME="127.0.0.1";
privateIntegerPORT=21;
//本地图片路径
privateStringFilePackage="F:\\Programming_Package\\IMG_3733_1.JPG";
//用户名密码
privateStringUSERNAME="czy";
privateStringPASSWORD="czy";
/**
*有工具类测试
**/
@Test
publicvoidtestUtil()throwsException{
FileInputStreaminputStream=newFileInputStream(newFile("F:\\Programming_Package\\IMG_3733_1.JPG"));
FtpUtil.uploadFile(HOSTNAME,PORT,USERNAME,PASSWORD,"/myftp/images","/2016/11/24","hello.jpg",inputStream);
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!