首页 > 开发 > Java > 正文

Java实现跨服务器上传文件功能

2024-07-13 10:16:33
字体:
来源:转载
供稿:网友

前几天做个项目,本身客户端和管理员端是写在一起的,共用一台服务器,客户上传的文件都是存在服务器的硬盘上的。老龙提出要把客户端和管理员端分离,这时候用户上传的附件的存储就出现问题了。显然,把大到几百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中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表