网站建设资讯

NEWS

网站建设资讯

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

这篇文章主要介绍了Java怎么实现跨服务器上传文件功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

创新互联专注于企业营销型网站建设、网站重做改版、路北网站定制设计、自适应品牌网站建设、H5场景定制商城开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为路北等各大城市提供网站开发制作服务。

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

感谢你能够认真阅读完这篇文章,希望小编分享的“Java怎么实现跨服务器上传文件功能”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!


分享名称:Java怎么实现跨服务器上传文件功能
本文地址:http://njwzjz.com/article/jsoecd.html