更多知识,更多乐趣

当前位置:首页软件开发Java → Java实现跨服务器上传文件功能

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

时间:2018-01-15 00:18:35来源:互联网我要评论(0)

项目要把客户端和管理员端分离,这时候用户上传的附件的存储就出现问题了。显然,把大到几百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中。

相关文章

网友评论

热门评论

最新评论

发表评论 查看所有评论()

昵称:
表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
字数: 0/500 (您的评论需要经过审核才能显示)

推荐文章

最新文章

关于万荚 | 联系方式 | 发展历程 | 版权声明 | 帮助(?) | 网站地图 | 友情链接

Copyright 2005-2018 16WJ.COM 〖万荚网〗 版权所有 桂ICP备18000060号 |

声明: 本站所有文章来自互联网 如有异议 请与本站联系