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包,有上传,下载以及删除功能。附上代码:

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中。

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

您可能感兴趣的文章:

  • Java实现文件上传服务器和客户端
  • java实现多文件上传至本地服务器功能
  • Java实现文件上传至服务器的方法
  • java文件上传至ftp服务器的方法
  • java实现上传文件到服务器和客户端
  • Java上传文件到服务器端的方法
  • Java上传文件图片到服务器的方法
  • 基于HTML5+js+Java实现单文件文件上传到服务器功能
  • Java实现图片上传到服务器并把上传的图片读取出来
  • java实现客户端向服务器发送文件
时间: 2018-01-10

java实现上传文件到服务器和客户端

JAVA编写一个可以上传文件的服务器和客户端,具体内容如下 服务端 class Server { public static void main(String[] args) throws Exception { //建立服务端Socket ServerSocket ss = new ServerSocket(10005); //接收客户端Socket Socket fileLoaderSocket = ss.accept(); //打印连接信息 String ip = fileLoaderSo

Java实现文件上传服务器和客户端

本文实例为大家分享了Java实现文件上传服务器和客户端的具体代码,供大家参考,具体内容如下 文件上传服务器端: /** * 使用TCP协议实现上传功能的服务器端 * 思路: * 新建ServerSocket * 等待客户端连接 * 连接上后开启子线程,把连接获取的Socket传给子线程 * 循环进行 * @author yajun * */ public class UploadServer { public static void main(String[] args) { UploadSer

java实现客户端向服务器发送文件

本文实例为大家分享了java实现客户端向服务器发送文件的具体代码,供大家参考,具体内容如下 服务器源代码: import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.In

java实现多文件上传至本地服务器功能

博主最近在做一个内网项目,内部可以访问外部数据,但是外部访问不了内部数据,这也就造成了可能文件无法上传,所以博主另辟蹊径,在本地服务器上建立一个文件夹专门用来存储上传数据. 环境:jdk,tomcat 一.前台上传文件(ajax上传) <input type="file" name="annexUrl" id="annexUrl" multiple="multiple"/> 其中multiple="mul

java文件上传至ftp服务器的方法

用java实现ftp文件上传.我使用的是commons-net-1.4.1.zip.其中包含了众多的java网络编程的工具包. 1.把commons-net-1.4.1.jar包加载到项目工程中去. 2.看如下代码: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.commons.net.ft

Java上传文件图片到服务器的方法

这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存,具体内容如下 首先是页面html的   我这是提交一个文件和类型 <div style="border: 1px solid red;"> 我是添加一张临时图片得到微信的media_id保存数据库! <form action="xxxxxxxxm" enctype="multipart/form-data" method="post">

Java上传文件到服务器端的方法

Web文件上传采用POST的方式,与POST提交表单不同的是,上传文件需要设置FORM的enctype属性为multipart/form-data.由于上传的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传.如果不设置,enctype属性默认为application/x-www-form-urlencoded,使用浏览器将使用ASCII向服务器发送数据,导致发送文件失败. 上传文件要使用文件域(<input type='file'/>,并把FORM的Enctype设置为multipar

Java实现图片上传到服务器并把上传的图片读取出来

在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢? 下面说一下我的实现过程(只是个人实现思路,实际网站怎么实现的不太清楚) 实现的思路: 工具:MySQL,eclipse 首先,在MySQL中创建了两个表,一个t_user表,用来存放用户名,密码等个人信息, 一个t_touxiang表,用来存放上传的图片在服务器中的存放路径,以及图片名字和用户ID, T_touxiang表中的用户ID对应了t_user中的i

基于HTML5+js+Java实现单文件文件上传到服务器功能

上传单文件到服务器       应公司要求,在HTML5页面上实现上传文件到服务器,对于一个还没毕业的实习生菜鸟来说,这可不得了-----不会,网上各种百度,找各种博客还是没解决,最后还是请教了公司的大神,人家给卸了一个例子,然后根据人家写的终于把这个上传文件搞定. 好了,开始上代码. HTML5代码: <form name="upform" action="" method="POST"> <input type ="

Java实现文件上传至服务器的方法

在我们的web开发中,很多的时候都需要把本机的一些文件上传到web服务器上面去. 如:一个BBS系统,当用户使用这是系统的时候,能把本机的一些图片,文档上传到服务器上面去.然后其他用户可以去下载这些文件,那么这样的话,我们可以自己编程实现文件的上传 但是更好的方式是使用一些已有的组件帮助我们实现这种上传功能. 常用的上传组件: Apache 的 Commons FileUpload JavaZoom的UploadBean jspSmartUpload upload.jsp 代码: <%@ pag

Java实现文件上传的两种方法(uploadify和Spring)

最近项目中用到的两种文件上传方式做一下总结: 一. uploadify: uploadify控件的scripts和styles在这里:图片上传 JSP: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ include file="../jsp/include/taglibs.jsp"%> <!DOCTYPE HTML PUBL

FasfDFS整合Java实现文件上传下载功能实例详解

在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</arti

Java大文件上传详解及实例代码

Java大文件上传详解 前言: 上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败. 一开始以为是session过期或者文件大小受系统限制,导致的错误.查看了系统的配置文件没有看到文件大小限制,web.xml中seesiontimeout是30,我把它改成了120.但还是不行,有时候10分钟就崩了. 同事说,可能是客户这里服务器网络波动导致网络连接断开,我觉得有点道理.但是我在本地测试的时候发觉上传也失败,网络原因排除. 看了日志,错误为: java.lang.OutOfMemor

Java实现图片上传至服务器功能(FTP协议)

本文为大家分享了java实现图片上传至服务器功能的具体代码,供大家参考,具体内容如下 本案例实现图片上传功能分为两个步骤,分别为 (1)APP用base64加密将图片内容上传至服务器(http协议),在临时目录中先存储好图片: (2)将服务器临时存储的图片用FTP协议上传至另一台专门用做存储图片的服务器: /** * ftp 文件操作服务实现类 * */ @Service public class FtpFileServiceImpl implements IFtpFileService { /

Java文件上传与文件下载实现方法详解

本文实例讲述了Java文件上传与文件下载实现方法.分享给大家供大家参考,具体如下: Java文件上传 数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传.文件上传是数据上传的一种特例,指客户端向服务器上传文件.即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中. 1.上传表单要求 文件上传要求客户端提交特殊的请求--multipart请求,即包含多部分数据的请求.必须将<form/>标签的enctype属性值设为"multipart/form-d

Java实现文件上传的方法

本文实例为大家分享了Java实现文件上传的具体代码,具体内容如下 1.java代码: package com.github.reston.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import javax