java 中 FtpClient 实现 FTP 文件上传、下载

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

源代码大部分是网上找的,查来查去,找到几个可以用的例子,改来改去,揉合成现在这个样子。

一、 jar包准备(web service 的jar  不需要)

 

二、配置文件:

 

配置文件内容:

 

ftpUserName=hn_name
ftpPassword=hn_pwd
ftpHost=10.3.4.222
ftpPort=21
ftpPath=/home/hn_dhmp
writeTempFielPath=D\:\\ftpDownLoad

 

 

 

 

 

 

三、 ftp 工具类:

 

 

<strong>package ftp;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;/*** ftp 上传、下载工具类* @author JiangYu*/
public class FtpUtil {  private static Logger logger = Logger.getLogger(FtpUtil.class);  /** * 获取FTPClient对象 * @param ftpHost FTP主机服务器 * @param ftpPassword FTP 登录密码 * @param ftpUserName FTP登录用户名 * @param ftpPort FTP端口 默认为21 * @return */  public static FTPClient getFTPClient(String ftpHost, String ftpPassword,  String ftpUserName, int ftpPort) {  FTPClient ftpClient = null;  try {  ftpClient = new FTPClient();  ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器  ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器  if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {  logger.info("未连接到FTP,用户名或密码错误 !");  ftpClient.disconnect();  } else {  logger.info("FTP连接成功。");  }  } catch (SocketException e) {  e.printStackTrace();  logger.info("请检查FTP的IP地址 ! ");  } catch (IOException e) {  e.printStackTrace();  logger.info("请核对FTP的端口 ! ");  }  return ftpClient;  }  /*** 上传本地文件到FTP服务器   * @param ftpPath 服务器上存放文件的路径* @param ftpUserName ftp服务账号* @param ftpPassword ftp服务密码* @param ftpHost ftp服务ip* @param ftpPort ftp服务端口* @param fileContent 文件内容* @param writeTempFielPath 文件在本地的路径*/public static String upload(String ftpPath, String ftpUserName, String ftpPassword,  String ftpHost, int ftpPort, String fileContent, String writeTempFielPath) {  FTPClient ftpClient = null;  String uploadResult = "";try {  ftpClient = getFTPClient(ftpHost, ftpPassword,  ftpUserName, ftpPort);  // 设置PassiveMode传输  ftpClient.enterLocalPassiveMode();  // 设置以二进制流的方式传输  ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  // 对远程目录的处理  String remoteFileName = ftpPath;  if (ftpPath.contains("/")) {  remoteFileName = ftpPath  .substring(ftpPath.lastIndexOf("/") + 1);  }  // 先把文件写出到本地,再上传到FTP上,最后再删除 。String result = write(remoteFileName, fileContent,  writeTempFielPath);  if (result.contains("成功")) {  File f = new File(writeTempFielPath + "/" + remoteFileName);  InputStream in = new FileInputStream(f);  ftpClient.storeFile(remoteFileName, in);  in.close();  uploadResult = "文件" + remoteFileName + "上传成功!";f.delete(); // 删除本地临时文件} else {  uploadResult =  "文件" + remoteFileName + "上传失败!";}  return uploadResult;} catch (Exception e) {  e.printStackTrace();  return uploadResult+"错误源: "+e.getMessage();}finally{  try {  ftpClient.disconnect();  } catch (IOException e) {  e.printStackTrace();  }  }  }  /*** 文件写出到本地* @param fileName 文件名* @param fileContext 文件内容* @param writeTempFielPath 本地存储路径* @return*/public static String write(String fileName, String fileContext,  String writeTempFielPath) {  String result = "写出成功 !";try {  File f = new File(writeTempFielPath + "/" + fileName);  if(!f.exists()){  if(!f.createNewFile()){  result = "文件不存在,创建失败 !";}  }  BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));  bw.write(fileContext.replaceAll("\n", "\r\n"));  bw.flush();  bw.close();  return result;  } catch (Exception e) {  result = "写出失败 !";e.printStackTrace();  return result;  }  }  /** * 从FTP服务器下载文件 * @param ftpHost FTP服务器IP * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param remotePath FTP服务器上的相对路径 * @param fileName 要下载的文件名 * @param localPath 下载后保存到本地的路径 * @return */public static String downFile(String ftpHost, int port,String username, String password,String remotePath,String fileName,String localPath) { String result = "下载失败 !"; FTPClient ftp = new FTPClient(); try { int reply; ftp.connect(ftpHost, port); ftp.login(username, password); // 登录 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return "服务连接失败 !"; } ftp.changeWorkingDirectory(remotePath); // 转移到FTP服务器目录 FTPFile[] fs = ftp.listFiles(); boolean flag = false; // 下载文件不存在for(FTPFile ff:fs){ if(ff.getName().equals(fileName)){ File localFile = new File(localPath+"/"+ff.getName()); OutputStream is = new FileOutputStream(localFile); ftp.retrieveFile(ff.getName(), is); is.close(); flag = true;} }ftp.logout(); if(!flag){result = "文件: "+fileName+"不存在 !"; }else{result = "下载成功 !"; }} catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) {} } } return result; }}  </strong>

 

 

 

upload方法可以用这个方法代替,直接上传整个文件,而不作用把文件内容作为参数,此方法主体代码来自网络:

 

package ftp;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;import org.apache.commons.net.ftp.FTPClient;
/*** 文件上传替换方法 **/
public class FtpUpToo {private static FTPClient ftpClient = null;  /** * ftp上传文件* @param targetFname 生成目标文件 * @return true||false */  public static boolean uploadFile(String targetFname){  int ftpPort = 0;  String ftpUserName = "";  // ftp服务账号String ftpPassword = "";  // ftp服务密码String ftpHost = "";  // ftp服务ipString ftpPath = "";  // ftp服务器上存放文件的路径String writeTempFielPath = "";  // 文件在本地的路径String proName = "ftp.properties"; // 配置文件名try {// 配置文件一定要和本类放在同一包下才能找到 InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName);  if (in == null) {  throw new Exception("配置文件"+proName+"读取失败 !");} Properties properties = new Properties();  properties.load(in);  ftpUserName = properties.getProperty("ftpUserName");  ftpPassword = properties.getProperty("ftpPassword");  ftpHost = properties.getProperty("ftpHost");  ftpPort = Integer.valueOf(properties.getProperty("ftpPort"))  .intValue();  ftpPath = properties.getProperty("ftpPath");  writeTempFielPath = properties.getProperty("writeTempFielPath"); } catch (Exception e) {e.printStackTrace();}    boolean flag = false;  ftpClient = FtpUtil.getFTPClient(ftpHost, ftpPassword, ftpUserName, ftpPort); if( ftpClient!=null ){  File srcFile = new File(writeTempFielPath+"/JiangYuUp.csv");   FileInputStream fis = null;  try {  fis  = new FileInputStream(srcFile);  //设置上传目录   ftpClient.changeWorkingDirectory(ftpPath);  ftpClient.setBufferSize(1024);   ftpClient.setControlEncoding("GBK");   //设置文件类型(二进制)   ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  //上传  flag = ftpClient.storeFile(targetFname, fis);   } catch (Exception e) {  e.printStackTrace();  closeCon();  }finally{  try {fis.close();System.out.println("运行结束!----");} catch (IOException e) {e.printStackTrace();}}  }  return flag;  }/** * 销毁ftp连接*/  public static void closeCon(){  if(ftpClient !=null){  if(ftpClient.isConnected()){  try {  ftpClient.logout();  ftpClient.disconnect();  } catch (IOException e) {  e.printStackTrace();  }   }  }  }  }

 

 

 

 

 

四、测试类:

 

 

<strong>package ftp;import java.io.InputStream;
import java.util.Properties;public class FtpTest {  public static void main(String[] args) {  new FtpTest().test();}  private void test(){int ftpPort = 0;  String ftpUserName = "";  // ftp服务账号String ftpPassword = "";  // ftp服务密码String ftpHost = "";  // ftp服务ipString ftpPath = "";  // ftp服务器上存放文件的路径String writeTempFielPath = "";  // 文件在本地的路径String proName = "ftp.properties"; // 配置文件名try {  // 配置文件一定要和本类放在同一包下才能找到 InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName);  if (in == null) {  throw new Exception("配置文件"+proName+"读取失败 !");} Properties properties = new Properties();  properties.load(in);  ftpUserName = properties.getProperty("ftpUserName");  ftpPassword = properties.getProperty("ftpPassword");  ftpHost = properties.getProperty("ftpHost");  ftpPort = Integer.valueOf(properties.getProperty("ftpPort"))  .intValue();  ftpPath = properties.getProperty("ftpPath");  writeTempFielPath = properties.getProperty("writeTempFielPath");  // 下载String result = FtpUtil.downFile(ftpHost, ftpPort, ftpUserName, ftpPassword,ftpPath, "JiangYu.csv", writeTempFielPath);  // JiangYu.csv:下载文件的名称System.out.println("文件下载结果为:" + result);  // 上传ftpPath = ftpPath + "/" + "JiangYu.csv";  // JiangYu.csv:上传文件的名称FtpUtil.upload(ftpPath, ftpUserName, ftpPassword, ftpHost, ftpPort, "这里是文件内容", writeTempFielPath);  } catch (Exception e) {  e.printStackTrace();  }  }
}  </strong>

 

 

注:  测试类运行后下载成功的文件 和 上传时的临时文件是一样的名字,会被上传成功后删除临时文件操作所删除。

 建议上传和下载分开测试。

 

五、 上传、下载结果:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongDB集合文档操作符

一、MongoDB - 连接1.启动 MongoDB 服务只需要在 MongoDB 安装目录的 bin 目录下执行 mongod 即可执行启动操作后&#xff0c;mongodb 在输出一些必要信息后不会输出任何信息&#xff0c;之后就等待连接的建立&#xff0c;当连接被建立后&#xff0c;就会开始打印日志信息。可以…

LIMIT M,N分页性能优化方案

利用子查询优化 说明: MySQL 并不是跳过 offset 行&#xff0c;而是取 offsetN 行&#xff0c;然后返回放弃前 offset 行&#xff0c;返回 N 行&#xff0c;那当 offset 特别大的时候&#xff0c;此时使用limit m,n效率就非常的低下。想要提升性能要么控制返回的总页数&#…

PHP获取文件后缀名

PHP获取文件后缀名是PHP学习者常见的一种操作&#xff0c;无论是在面试过程中还是PHP新手自学中。PHP获取文件后缀名都是很普遍的需要掌握的一个知识点。下面我们就给大家总结介绍PHP获取文件扩展名也就是后缀名的两种方法&#xff01;一、通过pathinfo首先大家应该知道pathinf…

Web Service 简单实例(java 版本) ,IDE自动生成客户端代码方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、客户端工程 jar 包 &#xff1a; 二、1. 服务端&#xff1a;( new 一个web service project ) package com;import javax.jws.…

最佳Linux服务器发行版

一款Linux发行版就如同一件衣服一样&#xff0c;适合自己的才是最好的选择。 对大型企业而言&#xff0c;当然首选Red Hat Enterprise Linux&#xff08;RHEL&#xff09;。Red Hat有完善的技术支持服务&#xff0c;而且在我们周围&#xff0c;非常容易找到持有Red Hat认证的技…

在线代码编辑器 Codemirror 的轻量级 React 组件

代码编辑器 CodeMirror 的轻量级 React 组件 demo uiw-react.github.io/react-codem… 特性: ? 自动根据 mode 配置加载 mode 文件。 ? 快速简单的配置 API。 安装 npm install uiw/react-codemirror --save 复制代码使用 import CodeMirror from uiw/react-codemirror; impo…

「机械」4大传动方式优劣对比:机械、电气、气压、液压

传动方式有很多种。目前应用比较多的四大类传动方式&#xff08;机械、电气、液压和气压&#xff09;中&#xff0c;没有一种动力传动是十全十美的。今天跟大家分享4种传动方式的优劣对比。 一. 机械传动 1. 齿轮传动 齿轮传动是机械传动中应用最广的一种传动形式。它的传动比较…

一次性获取多个oracle序列的值,实现关联表多数据的批量insert

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 业务 要求批量导入不小于10W条数据到 user 表&#xff0c;但是user表在 insert 每条数据的同时要 insert 一条对应数据到 customer表…

开始使用C++11的9个理由

如果你的代码工作正常并且表现良好&#xff0c;你可能会想知道为什么还要使用C 11。当然了&#xff0c;使用用最新的技术感觉很好&#xff0c;但是事实上它是否值得呢&#xff1f; 在我看来&#xff0c;答案毫无疑问是肯定的。我在下面给出了9个理由&#xff0c;它们分为两类&a…

MySQL批量update数据(更新的数据值不同)

(一)纯mysql: ​UPDATE my_table SETstatus CASE idWHEN 1 THEN 3WHEN 2 THEN 4WHEN 3 THEN 5END,title CASE idWHEN 1 THEN New Title 1WHEN 2 THEN New Title 2WHEN 3 THEN New Title 3END WHERE id IN (1,2,3) (二)mybatis写法 1:foreach <update id"batchUpd…

webpack+vue-cli 中proxyTable配置接口地址代理

在项目开发的时候&#xff0c;接口联调的时候一般都是同域名下&#xff0c;且不存在跨域的情况下进行接口联调&#xff0c;但是当我们现在使用vue-cli进行项目打包的时候&#xff0c;我们在本地启动服务器后&#xff0c;比如本地开发服务下是 http://localhost:8080 这样的访问…

AMQP 协议介绍

RabbitMQ 是遵从AMQP 协议的&#xff0c; 换句话说&#xff0c; RabbitMQ 就是AMQP 协议的Erlang 的实现(当然RabbitMQ 还支持STOMP2 、MQTT3 等协议) 0 AMQP 的模型架构和RabbitMQ 的模型架构是一样的&#xff0c;生产者将消息发送给交换器&#xff0c;交换器和队列绑定。当生…

关联表多数据的批量insert (批量导入,测试19W条数据用时46秒)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、业务需求 &#xff1a;作多个批量导入 &#xff0c;根据业务不同&#xff0c;每条数据导入前作各种验证&#xff0c; 导入后提示验证…

Java已死?九百万程序员说不

Java没死&#xff0c;事实上它拥有足够的能量让你的应用跑起来。那些对Java吹毛求疵人频繁地聚焦在一些小众问题上&#xff0c;总是和其他技术或者语言做些不公平的对比&#xff0c;这些语言并没有像Java一样得到广泛应用及长远的历史。 现在的小孩都能学Java&#xff0c;它在…

Linux SSH远程管理故障如何排查?

SSH远程管理故障排查方案&#xff1a;1、检测两个机器是否畅通两个机器之间是否畅通&#xff0c;查看物理链路是否有问题(网线网卡、IP是否正确)第1步&#xff1a;物理链路是否畅通&#xff0c;比喻为“高速公路是否畅通”ping 排查客户端到服务端的线路问题&#xff0c;ping是…

CSS中position的absolute和relative用法

static: HTML元素的默认定位方式absolute: 将对象从文档流中拖出&#xff0c;使用left&#xff0c;right&#xff0c;top&#xff0c;bottom等属性进行绝对定位。而其层叠通过z-index属性定义。绝对定位的元素的位置相对于最近的已定位父元素&#xff0c;如果元素没有已定位的父…

Spring HttpMessageNotReadableException异常

&#xff08;一&#xff09;现象 我们在进行服务间的rpc调用时&#xff0c;可能会遇到org.springframework.http.converter.HttpMessageNotReadableException异常。 其具体报错如下&#xff1a; {"timestamp": 1456043810789,"status": 400,"error…

解决 -- java 调用webservice 服务端收到参数为null

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我的客户端和服务端都写的很简单&#xff0c;只是调用服务的时候&#xff0c; 服务端得不到参数&#xff0c;后来发现只改一个地方就可…

fastJson性能测试

测试装备&#xff1a; mac pro 6核12线程 测试代码&#xff1a; &#xff08;1&#xff09;序列化对象&#xff1a; import lombok.Data;Data public class User {int id;String name;int age;String address; } &#xff08;2&#xff09;序列化逻辑&#xff1a; import…