Java实现跨服务器上传文件功能
前几天做个项目,本身客户端和管理员端是写在一起的,共用一台服务器,客户上传的文件都是存在服务器的硬盘上的。老龙提出要把客户端和管理员端分离,这时候用户上传的附件的存储就出现问题了。显然,把大到几百M的apk文件存到数据库不现实,查了半天,在两端建立ftp服务器传文件是最快的方法。
具体流程是,用户登录外网客户端,上传文件到外网的服务器硬盘上,在此同时,文件通过外网服务器访问内网管理员服务器的ftp服务器,传到内网服务器的硬盘上。这样内网服务器可以对上传的文件进行加密签名工作,之后也通过ftp的方式把文件回传到外网服务器硬盘上,供用户进行其他操作。
具体实现时用到的工具:Serv-U。Serv-U是一个方便我们在windows上建立ftp服务器的工具。下载破解后,按照步骤,设置好Ip、端口、账户密码、允许ftp访问的磁盘路径、操作权限等,就可以使用了。IP在本机测试的时候就选127.0.0.1,内网测试时就选192.168.0.x。
在java项目中的实现,我自己写了个工具类,用到了apache的commons-net包,有上传,下载以及删除功能。附上代码:
packageapp.ftp;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importorg.apache.commons.net.ftp.FTPClient;
importorg.apache.commons.net.ftp.FTPFile;
importorg.apache.commons.net.ftp.FTPReply;
/**
*FTP服务器工具类
*
*/
publicclassFTPUtils{
/**
*上传文件至FTP服务器
*
*@paramurl
*服务器IP地址
*@paramport
*服务器端口
*@paramuserName
*用户登录名
*@parampassword
*用户登录密码
*@paramstorePath
*服务器文件存储路径
*@paramfileName
*服务器文件存储名称
*@paramis
*文件输入流
*@return
*true:上传成功
*
*false:上传失败
*/
publicstaticbooleanstoreFile(Stringurl,intport,StringuserName,Stringpassword,StringstorePath,StringfileName,InputStreamis){
booleanresult=false;
FTPClientftp=newFTPClient();
try{
//连接至服务器,端口默认为21时,可直接通过URL连接
ftp.connect(url,port);
//登录服务器
ftp.login(userName,password);
//判断返回码是否合法
if(!FTPReply.isPositiveCompletion(ftp.getReplyCode())){
//不合法时断开连接
ftp.disconnect();
//结束程序
returnresult;
}
//判断ftp目录是否存在,如果不存在则创建目录,包括创建多级目录
Strings="/"+storePath;
String[]dirs=s.split("/");
ftp.changeWorkingDirectory("/");
//按顺序检查目录是否存在,不存在则创建目录
for(inti=1;dirs!=null&&itrue:下载成功
*
*false:下载失败
*/
publicstaticbooleanretrieveFile(Stringurl,intport,StringuserName,Stringpassword,StringremotePath,StringfileName,StringlocalPath){
booleanresult=false;
FTPClientftp=newFTPClient();
OutputStreamos=null;
try{
//连接至服务器,端口默认为21时,可直接通过URL连接
ftp.connect(url,port);
//登录服务器
ftp.login(userName,password);
//判断返回码是否合法
if(!FTPReply.isPositiveCompletion(ftp.getReplyCode())){
//不合法时断开连接
ftp.disconnect();
//结束程序
returnresult;
}
//设置文件操作目录
ftp.changeWorkingDirectory(remotePath);
//设置文件类型,二进制
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//设置缓冲区大小
ftp.setBufferSize(3072);
//设置字符编码
ftp.setControlEncoding("UTF-8");
//构造本地文件对象
FilelocalFile=newFile(localPath+"/"+fileName);
//获取文件操作目录下所有文件名称
String[]remoteNames=ftp.listNames();
//循环比对文件名称,判断是否含有当前要下载的文件名
for(StringremoteName:remoteNames){
if(fileName.equals(remoteName)){
result=true;
}
}
//文件名称比对成功时,进入下载流程
if(result){
//构造文件输出流
os=newFileOutputStream(localFile);
//下载文件
result=ftp.retrieveFile(fileName,os);
//关闭输出流
os.close();
}
//登出服务器
ftp.logout();
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
//判断输出流是否存在
if(null!=os){
//关闭输出流
os.close();
}
//判断连接是否存在
if(ftp.isConnected()){
//断开连接
ftp.disconnect();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
returnresult;
}
/**
*从FTP服务器删除文件
*
*@paramurl
*服务器IP地址
*@paramport
*服务器端口
*@paramuserName
*用户登录名
*@parampassword
*用户登录密码
*@paramremotePath
*服务器文件存储路径
*@paramfileName
*服务器文件存储名称
*@return
*true:删除成功
*
*false:删除失败
*/
publicstaticbooleandeleteFile(Stringurl,intport,StringuserName,Stringpassword,StringremotePath,StringfileName){
booleanresult=false;
FTPClientftp=newFTPClient();
try{
//连接至服务器,端口默认为21时,可直接通过URL连接
ftp.connect(url,port);
//登录服务器
ftp.login(userName,password);
//判断返回码是否合法
if(!FTPReply.isPositiveCompletion(ftp.getReplyCode())){
//不合法时断开连接
ftp.disconnect();
//结束程序
returnresult;
}
//设置文件操作目录
ftp.changeWorkingDirectory(remotePath);
//设置文件类型,二进制
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//设置缓冲区大小
ftp.setBufferSize(3072);
//设置字符编码
ftp.setControlEncoding("UTF-8");
//获取文件操作目录下所有文件名称
String[]remoteNames=ftp.listNames();
//循环比对文件名称,判断是否含有当前要下载的文件名
for(StringremoteName:remoteNames){
if(fileName.equals(remoteName)){
result=true;
}
}
//文件名称比对成功时,进入删除流程
if(result){
//删除文件
result=ftp.deleteFile(fileName);
}
//登出服务器
ftp.logout();
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
//判断连接是否存在
if(ftp.isConnected()){
//断开连接
ftp.disconnect();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
returnresult;
}
publicstaticvoidmain(String[]args)throwsFileNotFoundException{
//try{
//FileInputStreamfis=newFileInputStream(newFile("D:/SoftStorage/软件工具箱/HTML_Help_WorkShop_1.3_XiaZaiBa.zip"));
//System.out.println(storeFile("192.168.1.2",21,"admin","1","C:/DocumentsandSettings/Administrator/桌面",RandomUUID.random()+".zip",fis));
//}catch(FileNotFoundExceptione){
//e.printStackTrace();
//}
//
//Filefile=newFile("C:/Users/freed/Desktop/1.txt");
//InputStreamis=newFileInputStream(file);
//System.out.println(storeFile("127.0.0.1",21,"feili","feili","examples","2.txt",is));
//System.out.println(retrieveFile("127.0.0.1",21,"feili","feili","examples/jsp","index.html","C:/Users/freed/Desktop"));
//System.out.println(deleteFile("127.0.0.1",21,"feili","feili","testpath","1.txt"));
}
}
需要注意的是上传文件的时候要将File文件先放入fileinputstream中。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。