Java实现文件上传到ftp服务器

一、ftp简介

文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。

FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。

1.1工作流程

在传输文件时,FTP 客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP 协议与操作系统无关,任何操作系统上的程序只要符合 FTP 协议,就可以相互传输数据

1.2工作模式

FTP支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式)

1.3传输方式

FTP的传输有两种方式:ASCII、二进制

二、windows开启ftp服务

在自己的电脑上可以开启一个ftp服务用于测试。

1:打开控制面板—>程序—>启动或关闭windows功能

找到互联网信息服务勾选✔其中的ftp服务器,web管理,万维网服务。

系统就会安装IIS服务管理器了,安装过程可能需要等待几分钟。

2:回到电脑桌面,右击“计算机”,点击 管理,进入计算机管理界面。在这里,我们就可以看到刚刚添加的IIS服务,接下来的操作就像我们在VPS主机上添加网站差不多的操作步骤了。选中IIS服务——>网站——>右键添加FTP站点

3:设置ftp基本信息。路径为远程连接的工作路径

选取本机的IP地址,SSL如果不涉密可以选无。

这里权限先这样设置之后再修改,点击完成即可。

保存后在此后即可看到添加的ftp服务。可以这样开启多个。

注意:

要想通过java程序连接FTP在这里我新建了一个FTP的用户,新建一个用户ftptest,密码:123456,如下所示

这里注意一定要把√取消掉确定完成新建,之后修改FTP服务器设置,添加这个特定用户。

点击创建的ftp名称—>ftp身份验证—>修改身份认证,禁止匿名身份

返回最开始的页面,添加刚才创建的用户,如果创建用户对勾选着可能添加不成功。

输入刚才新建的用户名和密码,完成

如何测试刚才新建的用户是否有效嘞有好多种方法常用的是CMD命令行和下面介绍的这种

打开我的电脑在最上面输入

ftp://+FTP之前设置的IP地址

我的是ftp://192.168.10.11/回车

输入用户和密码即可登录

注意:如果输入后弹出FTP文件夹错误,需要查看一下防火墙是否放行FTP服务器

解决方式:

1、打开防火墙,点击允许应用或功能通过Windows Defender防火墙

2、找到FTP服务器并勾选,然后点击确定

三、java连接ftp

org.apache.commons.net提供了对FTP的开发,引入以下依赖

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.9.0</version>
</dependency>

3.1ftp工具类

连接ftp服务

@Slf4j
public class FtpClient {

   /**
    * FTP服务地址
    */
   private static String FTP_IP;
   /**
    * FTP端口号
    */
   private static Integer FTP_PORT;
   /**
    * FTP用户名
    */
   private static String FTP_USER;
   /**
    * FTP密码
    */
   private static String FTP_PASSWORD;
   /**
    * FTP根路径
    */
   private static String FTP_PATH;
   /**
    * 映射盘符
    */
   private static String FTP_DRIVELETTER;
   private static FTPClient ftpClient;

   static {
      try {
         // 根据该类的class文件获取到yaml文件
         Yaml yaml = new Yaml();
         URL resource = FtpClient.class.getClassLoader().getResource("application-dev.yml");
         assert resource != null;
         // 把yaml文件加载到对象中
         Object obj = yaml.load(new FileInputStream(resource.getFile()));
         // 解析对象中的属性并赋值
         JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(obj));
         JSONObject ftp = jsonObject.getObject("fanhai", JSONObject.class).getObject("ftp", JSONObject.class);
         FTP_IP = String.valueOf(ftp.get("ip"));
         FTP_PORT = Integer.valueOf(String.valueOf(ftp.get("port")));
         FTP_USER = String.valueOf(ftp.get("username"));
         FTP_PASSWORD = String.valueOf(ftp.get("password"));
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   public static FTPClient getFtpConnection() {
      ftpClient = new FTPClient();
      try {
         //连接
         ftpClient.connect(FtpClient.FTP_IP, FtpClient.FTP_PORT);
         //设置编码
         ftpClient.setControlEncoding("UTF-8");
         //设置传输文件类型
         ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
         //登录
         ftpClient.login(FtpClient.FTP_USER, FtpClient.FTP_PASSWORD);
         if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            log.info("==============未连接到FTP,用户名或密码错误=================");
            //拒绝连接
            ftpClient.disconnect();
         } else {
            log.info("==============连接到FTP成功=================");
         }
      } catch (SocketException e) {
         e.printStackTrace();
         log.info("==============FTP的IP地址错误==============");
      } catch (IOException e) {
         e.printStackTrace();
         log.info("==============FTP的端口错误==============");
      }
      return ftpClient;
   }

   public static void closeConnect() {
      log.warn("关闭ftp服务器");
      try {
         if (ftpClient != null) {
            ftpClient.logout();
            ftpClient.disconnect();
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

ftp工具类,进行文件的上传、下载操作

public class FtpUtils {
   /**
    * 上传单个文件到远程
    *
    * @param ftpPath        路径
    * @param uploadFileName 文件名
    * @param input          输入流
    * @return
    */
   public static boolean uploadFile(String ftpPath, String uploadFileName, InputStream input) {
      boolean issuccess = false;
      FTPClient ftpClient = null;
      try {
         ftpClient = FtpClient.getFtpConnection();

         //切换到工作目录
         if (!ftpClient.changeWorkingDirectory(ftpPath)) {
            ftpClient.changeWorkingDirectory("/");
            String[] dirs = ftpPath.split("/");
            for (String dir : dirs) {
               ftpClient.makeDirectory(dir);
               ftpClient.changeWorkingDirectory(dir);
            }
         }

         ftpClient.enterLocalPassiveMode();//工作模式被动
         //文件写入 远程文件名;输入流
         boolean storeFile = ftpClient.storeFile(uploadFileName, input);
         if (!storeFile) {
            return issuccess;
         }
         input.close();
         ftpClient.logout();
         issuccess = true;
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         if (ftpClient.isConnected()) {
            try {
               ftpClient.disconnect();
            } catch (IOException ioe) {
            }
         }
      }
      return issuccess;
   }

   private String inputStreamToString(InputStream inputStream) {
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
      StringBuffer stringBuffer = new StringBuffer();
      String oneLine = "";
      try {
         while ((oneLine = bufferedReader.readLine()) != null) {
            stringBuffer.append(oneLine);
         }
         return stringBuffer.toString();
      } catch (IOException e) {
         e.printStackTrace();
      }
      return null;
   }
}

  • 1
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实现将MP4文件上传FTP服务器,可以使用Java中的Apache Commons Net库提供的FTP客户端来实现。 首先,你需要在项目中添加Apache Commons Net库的依赖,然后创建一个FTP客户端的实例。 ```java import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; public class FTPUploader { public static void main(String[] args) { String server = "ftp.example.com"; int port = 21; String user = "username"; String password = "password"; String localFile = "path/to/local/file.mp4"; String remoteFile = "path/to/remote/file.mp4"; FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(server, port); ftpClient.login(user, password); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.storeFile(remoteFile, new FileInputStream(localFile)); ftpClient.logout(); } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 在以上代码中,你需要提供FTP服务器的主机名、端口号、用户名和密码。然后,指定本地MP4文件的路径和上传后在FTP服务器上保存文件的路径。 连接并登录到FTP服务器后,设置文件类型为二进制,然后使用`storeFile`方法上传本地文件到指定的远程路径。 最后,退出登录并断开与FTP服务器的连接。 需要注意的是,这只是一个简单的示例,你可能需要添加一些错误处理和异常处理来提高代码的鲁棒性。同时,还可以根据需求进一步封装这个功能以便于复用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值