Java实现跨服务器上传文件功能
程序员文章站
2023-12-17 13:12:22
前几天做个项目,本身客户端和管理员端是写在一起的,共用一台服务器,客户上传的文件都是存在服务器的硬盘上的。老龙提出要把客户端和管理员端分离,这时候用户上传的附件的存储就出现...
前几天做个项目,本身客户端和管理员端是写在一起的,共用一台服务器,客户上传的文件都是存在服务器的硬盘上的。老龙提出要把客户端和管理员端分离,这时候用户上传的附件的存储就出现问题了。显然,把大到几百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包,有上传,下载以及删除功能。附上代码:
package app.ftp; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import org.apache.commons.net.ftp.ftpclient; import org.apache.commons.net.ftp.ftpfile; import org.apache.commons.net.ftp.ftpreply; /** * ftp服务器工具类 * */ public class ftputils { /** * 上传文件至ftp服务器 * * @param url * 服务器ip地址 * @param port * 服务器端口 * @param username * 用户登录名 * @param password * 用户登录密码 * @param storepath * 服务器文件存储路径 * @param filename * 服务器文件存储名称 * @param is * 文件输入流 * @return * <b>true</b>:上传成功 * <br/> * <b>false</b>:上传失败 */ public static boolean storefile (string url, int port, string username, string password, string storepath, string filename, inputstream is) { boolean result = false; ftpclient ftp = new ftpclient(); try { // 连接至服务器,端口默认为21时,可直接通过url连接 ftp.connect(url ,port); // 登录服务器 ftp.login(username, password); // 判断返回码是否合法 if (!ftpreply.ispositivecompletion(ftp.getreplycode())) { // 不合法时断开连接 ftp.disconnect(); // 结束程序 return result; } // 判断ftp目录是否存在,如果不存在则创建目录,包括创建多级目录 string s = "/"+storepath; string[] dirs = s.split("/"); ftp.changeworkingdirectory("/"); //按顺序检查目录是否存在,不存在则创建目录 for(int i=1; dirs!=null&&i<dirs.length; i++) { if(!ftp.changeworkingdirectory(dirs[i])) { if(ftp.makedirectory(dirs[i])) { if(!ftp.changeworkingdirectory(dirs[i])) { return false; } }else { return false; } } } // 设置文件操作目录 ftp.changeworkingdirectory(storepath); // 设置文件类型,二进制 ftp.setfiletype(ftpclient.binary_file_type); // 设置缓冲区大小 ftp.setbuffersize(3072); // 上传文件 result = ftp.storefile(filename, is); // 关闭输入流 is.close(); // 登出服务器 ftp.logout(); } catch (ioexception e) { e.printstacktrace(); } finally { try { // 判断输入流是否存在 if (null != is) { // 关闭输入流 is.close(); } // 判断连接是否存在 if (ftp.isconnected()) { // 断开连接 ftp.disconnect(); } } catch (ioexception e) { e.printstacktrace(); } } return result; } /** * 从ftp服务器下载文件至本地 * * @param url * 服务器ip地址 * @param port * 服务器端口 * @param username * 用户登录名 * @param password * 用户登录密码 * @param remotepath * 服务器文件存储路径 * @param filename * 服务器文件存储名称 * @param localpath * 本地文件存储路径 * @return * <b>true</b>:下载成功 * <br/> * <b>false</b>:下载失败 */ public static boolean retrievefile (string url, int port, string username, string password, string remotepath, string filename, string localpath) { boolean result = false; ftpclient ftp = new ftpclient(); outputstream os = null; try { // 连接至服务器,端口默认为21时,可直接通过url连接 ftp.connect(url ,port); // 登录服务器 ftp.login(username, password); // 判断返回码是否合法 if (!ftpreply.ispositivecompletion(ftp.getreplycode())) { // 不合法时断开连接 ftp.disconnect(); // 结束程序 return result; } // 设置文件操作目录 ftp.changeworkingdirectory(remotepath); // 设置文件类型,二进制 ftp.setfiletype(ftpclient.binary_file_type); // 设置缓冲区大小 ftp.setbuffersize(3072); // 设置字符编码 ftp.setcontrolencoding("utf-8"); // 构造本地文件对象 file localfile = new file(localpath + "/" + filename); // 获取文件操作目录下所有文件名称 string[] remotenames = ftp.listnames(); // 循环比对文件名称,判断是否含有当前要下载的文件名 for (string remotename: remotenames) { if (filename.equals(remotename)) { result = true; } } // 文件名称比对成功时,进入下载流程 if (result) { // 构造文件输出流 os = new fileoutputstream(localfile); // 下载文件 result = ftp.retrievefile(filename, os); // 关闭输出流 os.close(); } // 登出服务器 ftp.logout(); } catch (ioexception e) { e.printstacktrace(); } finally { try { // 判断输出流是否存在 if (null != os) { // 关闭输出流 os.close(); } // 判断连接是否存在 if (ftp.isconnected()) { // 断开连接 ftp.disconnect(); } } catch (ioexception e) { e.printstacktrace(); } } return result; } /** * 从ftp服务器删除文件 * * @param url * 服务器ip地址 * @param port * 服务器端口 * @param username * 用户登录名 * @param password * 用户登录密码 * @param remotepath * 服务器文件存储路径 * @param filename * 服务器文件存储名称 * @return * <b>true</b>:删除成功 * <br/> * <b>false</b>:删除失败 */ public static boolean deletefile (string url, int port, string username, string password, string remotepath, string filename) { boolean result = false; ftpclient ftp = new ftpclient(); try { // 连接至服务器,端口默认为21时,可直接通过url连接 ftp.connect(url ,port); // 登录服务器 ftp.login(username, password); // 判断返回码是否合法 if (!ftpreply.ispositivecompletion(ftp.getreplycode())) { // 不合法时断开连接 ftp.disconnect(); // 结束程序 return result; } // 设置文件操作目录 ftp.changeworkingdirectory(remotepath); // 设置文件类型,二进制 ftp.setfiletype(ftpclient.binary_file_type); // 设置缓冲区大小 ftp.setbuffersize(3072); // 设置字符编码 ftp.setcontrolencoding("utf-8"); // 获取文件操作目录下所有文件名称 string[] remotenames = ftp.listnames(); // 循环比对文件名称,判断是否含有当前要下载的文件名 for (string remotename: remotenames) { if (filename.equals(remotename)) { result = true; } } // 文件名称比对成功时,进入删除流程 if (result) { // 删除文件 result = ftp.deletefile(filename); } // 登出服务器 ftp.logout(); } catch (ioexception e) { e.printstacktrace(); } finally { try { // 判断连接是否存在 if (ftp.isconnected()) { // 断开连接 ftp.disconnect(); } } catch (ioexception e) { e.printstacktrace(); } } return result; } public static void main(string[] args) throws filenotfoundexception { // try { // fileinputstream fis = new fileinputstream(new file("d:/soft storage/软件工具箱/html_help_workshop_1.3_xiazaiba.zip")); // system.out.println(storefile("192.168.1.2", 21, "admin", "1", "c:/documents and settings/administrator/桌面", randomuuid.random() + ".zip", fis)); // } catch (filenotfoundexception e) { // e.printstacktrace(); // } // //file file = new file("c:/users/freed/desktop/1.txt"); //inputstream is = new fileinputstream(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中。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。