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,一经查实,立即删除!

相关文章

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认证的技…

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

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

AMQP 协议介绍

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

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

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

CSS中position的absolute和relative用法

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

避免流量高峰期CDN问题的10个方法

在视频流媒体中&#xff0c;因平台火爆而出现问题是件好事。至少&#xff0c;这比根本没有观众要好。\\也许你正在使用世界级的CDN&#xff0c;但是&#xff0c;在大型赛事期间&#xff0c;当CDN的服务器和对等点流量变得饱和的时候&#xff0c;一些用户还是无法享受到流畅的体…

Android应用进入爆发期 手机游戏仍是市场重心

近日&#xff0c;91无线发布了《91无线移动应用发展趋势报告&#xff08;Android版&#xff09;》。报告显示&#xff0c;2012年&#xff0c;无论Android移动应用用户下载还是开发者研发均呈爆发态势&#xff0c;手机游戏仍是市场重心所在。同时&#xff0c;Android移动应用下载…

WebService中文件传输

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 WebService处理传递普通的信息&#xff0c;还可以传输文件&#xff0c;下面介绍WebService是怎么完成文件传输的。 1、 首先编写服务器端…

Django框架-Form组件

一、DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时&#xff0c;都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验&#xff0c;比如验证用户是否输入&#xff0c;输入的长度和格式等是否正…

主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间=k的个数)...

取板粗 好东西来的 1.&#xff08;HDOJ2665&#xff09;http://acm.hdu.edu.cn/showproblem.php?pid2665 &#xff08;POJ2104&#xff09;http://poj.org/problem?id2104 &#xff08;POJ2761&#xff09;http://poj.org/problem?id2761 题意&#xff1a;求区间第K大&…

分享Spring Cloud分布式微服务架构图

分布式、微服务、云架构JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从现在开始&#xff0c;我这边会将近期研发的springcloud微服务云架构的搭建过程和精髓记录下来&#xff0c;帮助更多有兴趣研发spring cloud框架的朋友&#xff0…

Lyft Level 5 Challenge 2018 - Elimination Round翻车记

打猝死场感觉非常作死。 A&#xff1a;判一下起点和终点是否在其两侧即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() {int x0,…

mysql用户的权限分配

2019独角兽企业重金招聘Python工程师标准>>> 因今天在分配数据库权限的时候&#xff0c;同事反映账户不能使用函数&#xff0c;遂搜集资料总结了一番关于mysql用户的权限分配。 MySQL 赋予用户权限命令的简单格式可概括为&#xff1a; grant 权限 on 数据库对象 to …

小米360口水战背后:国产手机第三态诞生

摘要&#xff1a;按照双方公布的配置信息&#xff0c;小米手机青春版为1.2G H z双核处理器&#xff0c;华为闪耀为1G H z双核。种向市场投入海量推广资金&#xff0c;以换取产品上的高利润&#xff0c;代表为步步高、金立、O PPO。南都制图&#xff1a;宋小伟 互联网入侵通信业…

线段与多边形的关系

转自周见智 介绍 最近项目中要用到有关几何&#xff08;Geometry&#xff09;方面的知识&#xff0c;程序需要判断给定的一条线段&#xff08;Segment&#xff09;与指定多边形&#xff08;Polygon&#xff09;的位置关系。这种关系分为三种&#xff1a;多边形包含线段、多边形…

解决,文件上传到 ftp 服务器,中文出现乱码问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 上传到 ftp 服务器&#xff0c;中文出现乱码解决&#xff0c;之前文件名 “ 网关信息 ” 始终不能正确显示&#xff0c;尝试了多种编码…

常用负载均衡策略分析

背景 一般生产环境单机所能承受的QPS压力为2w左右&#xff0c;过大的压力会导致服务器爆炸。即便是单机能够撑住2w QPS&#xff0c;一般也不会这么做&#xff0c;生产环境一般会预留50%的冗余能力&#xff0c;防止QPS因为某个热门的活动而爆炸。当QPS超过单机所能承受的压力时&…

解决- SecureCRT上运行 linux vim 命令中文出现乱码

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 乱码如图&#xff1a; 这个问题是CRT的编码设置造成的&#xff0c;改一下设置就可以了&#xff1a; 1. 在当前连接上右键选择最后一个 2…