普通的java Ftp客户端的文件上传
关于ftp上传文件其实并不难,但有时候面对现实的环境还是很蛋疼的,今天我就分享一下,普通的上传文件文件至FTP的方式,它满足大部分FTP,但也有特别的,下篇博客会提及到。
下面我用一个FtpUtil,来实现各种功能:
我们这里的主要功能是:
把本地文件夹下的文件上传到ftp的一个文件夹下 ,如果上传成功,就把上传成功的文件备份到另一个文件夹下,如果备份成功,就可以拿备份成功的文件删除了。
直接上代码了!
package cn.tendency.utils; import java.io.File; import org.apache.commons.net.ftp.*;
import org.apache.log4j.Logger; import java.io.*;
import java.util.ArrayList; public class FtpUtil { private static Logger log = Logger.getLogger(FtpUtil.class);
private FTPClient ftp; /**
* 文件上传FTP 连接ftp服务器
* @param url
* @param port
* @param username
* @param password
* @param zipPath
* @param ftpPath
* @param destPath
*/
public void fileUPL(String url, int port, String username, String password,String zipPath, String ftpPath,String destPath) {
// 连接ftp
boolean succ =false;
boolean flag = false;
try {
succ = this.connect(ftpPath, url, port, username, password);
log.info("连接ftp"+succ);
} catch (Exception e) {
// TODO Auto-generated catch block
log.error("连接FTP异常:"+e.getMessage());
}
// 切换目录
// FtpUtil.changeDirectory(ftp, ftpPath);
if(succ){
log.info("连接FTP成功!开始上传文件");
File file = new File(zipPath);
try {
flag=this.upload(file);
} catch (Exception e) {
// TODO Auto-generated catch block
log.error("上传文件异常:"+e.getMessage());
e.printStackTrace();
}
//暂时先把这行注释
FtpUtil.disconnectFTP(ftp);
} /*// 上传成功后备份压缩文件,不成功可以下次再传
if (flag){
boolean flag1 = FilesUtil.copyFile(zipPath, destPath);
if (flag1) {//备份成功后删除文件;
FilesUtil.deleteDir(zipPath);
}
}else{
log.error("上传文件失败!");
}*/
}
/**
* 创建连接
* @param url
* @param port
* @param username
* @param password
* @return
*/
public static FTPClient connectFTP(String url, int port, String username, String password) {
//创建ftp
FTPClient ftp = null;
try {
//创建地址
//InetAddress addr = new InetSocketAddress(url, port);
//连接
int reply;
ftp = new FTPClient();
ftp.connect(url, port);
ftp.login(username, password);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return ftp;
}
ftp.changeWorkingDirectory("/");
//登陆
//ftp.login(username, password.toCharArray());
// ftp.login(username, password);
// ftp.changeWorkingDirectory(path);
// ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// ftp.setDataTimeout(6000);
// ftp.setConnectTimeout(6000); // ftp.setSoTimeout(500000); } catch (Exception e) {
e.printStackTrace();
}
return ftp;
} /**
*
* @param path 上传到ftp服务器哪个路径下
* @param addr 地址
* @param port 端口号
* @param username 用户名
* @param password 密码
* @return
* @throws Exception
*/
private boolean connect(String path,String addr,int port,String username,String password) throws Exception {
boolean result = false;
ftp = new FTPClient();
int reply;
ftp.connect(addr,port);
ftp.login(username,password);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//设置ftp连接超时时间
// ftp.setDataTimeout(60000);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(path);
result = true;
return result;
}
/**
* 切换目录
* @param ftp
* @param path
*/
public static void changeDirectory(FTPClient ftp, String path) {
try {
// ftp.changeDirectory(path);
ftp.changeWorkingDirectory(path) ;
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 关闭ftp
* @param ftp
*/
public static void disconnectFTP(FTPClient ftp){
try {
//ftp.close();
ftp.disconnect();
log.info("disconnect success!!");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* Description: 向FTP服务器上传文件
* @Version1.0
* @param url FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param path FTP服务器保存目录
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String url,int port,String username, String password, String path, String filename, InputStream input) {
boolean success = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(url, port);//连接FTP服务器
//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);//登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.changeWorkingDirectory(path);
ftp.storeFile(filename, input); input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
} /**
* 上传文件
* @param localFile
* @param ftpFile
* @param ftp
*/
public static boolean upload_1(String localFile, String ftpFile,FTPClient ftp,String url, int port,
String username, String password) {
boolean flag = false ;
OutputStream os = null;
FileInputStream fis = null; try {
// 将ftp文件加入输出流中。输出到ftp上
File file = new File(localFile);
File[] file1 = file.listFiles();
if(null == file1 || file1.length<1){
log.error("待上传的文件目录:" + localFile + "里面不存在文件.");
}else{
// 创建一个缓冲区
for(int i=0;i<file1.length;i++){
// String str = ftpFile+"/"+file1[i].getName();
ftp.changeWorkingDirectory("/");
String str =file1[i].getName();
os = ftp.appendFileStream(str);
if (os == null ){
FtpUtil.disconnectFTP(ftp);
ftp = FtpUtil.connectFTP(url, port, username,password);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setDataTimeout(6000);
ftp.setConnectTimeout(6000);
os = ftp.appendFileStream(str);
}
fis = new FileInputStream(file1[i]);
byte[] bytes = new byte[1024*10];
int c;
while((c = fis.read(bytes)) != -1){
os.write(bytes, 0, c);
}
os.flush();
os.close();
fis.close();
// ftp1.disconnect();
}
flag = true ;
log.info("upload success!!");
} } catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(os!=null) {
os.close();
}
if(fis!=null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return flag ;
} /**
*
* @param file 上传的文件或文件夹
* @throws Exception
*/
private boolean upload(File file) throws Exception{
boolean flag=false;
ArrayList<Integer> numList = new ArrayList<Integer>();
int a=0;
try {
if(file.isDirectory()){ //我们读的是目录
log.info("上传的是文件夹");
// ftp.makeDirectory(file.getName());
// ftp.changeWorkingDirectory(file.getName());
String[] files = file.list();
//文件数
int fileNum=files.length;
log.info("文件夹下有"+fileNum+"个文件");
if(fileNum>4){
fileNum=4;
}
for (int i = 0; i < fileNum; i++) {
File file1 = new File(file.getPath()+"\\"+files[i] );
if(file1.isDirectory()){
upload(file1);
ftp.changeToParentDirectory();
}else{ //执行这一个
File file2 = new File(file.getPath()+"\\"+files[i]);
FileInputStream input = new FileInputStream(file2);
ftp.enterLocalPassiveMode();
ftp.storeFile(file2.getName(), input);
log.info("上传文件"+file.getPath()+"\\"+files[i]+"成功");
input.close();
flag=true;
// 上传成功后备份压缩文件,不成功可以下次再传
if (flag){
//备份
boolean flag1 = FilesUtil.copyFile2(file2, "D:\\MACCOLLECT\\laibin_maccollect\\maccollect\\laibin\\zip_backup"); if (flag1) {//备份成功后删除文件;
file2.delete(); }else {
log.error("备份文件失败!");
}
}
else{
log.error("上传文件失败!");
}
} }
}else{ //本项目不走这一个
File file2 = new File(file.getPath());
FileInputStream input = new FileInputStream(file2);
ftp.enterLocalPassiveMode();
ftp.storeFile(file2.getName(), input);
input.close();
flag=true;
} } catch (Exception e) {
flag=false;
log.error("上传文件异常:"+e.getMessage());
e.printStackTrace();
}
return flag;
}
}
下面是文件备份的代码:
分两种情况:第一种是备份一个目录下的所有文件夹到另一个目录下
第二种是备份单个文件到另一个目录下
首先是第一种情况:
/*
* 拷贝文件备份到对应的日期目录下,引用XmlCopyFile方法;
*/
public static boolean copyFile(String srcFileName, String destFileName) {
boolean flag = false;
File srcFile = new File(srcFileName);
// 判断源文件是否存在
if (!srcFile.exists()) {
log.error("源文件:" + srcFileName + "不存在!");
return flag;
} else if (!srcFile.isDirectory()) {
log.error("复制失败,源文件:" + srcFileName + "不是一个路径!");
return flag;
}
File[] Bfile = srcFile.listFiles();
flag = FilesUtil.XmlCopyFile(destFileName, Bfile);
return flag;
} public static boolean XmlCopyFile(String destFileName, File[] Bfile) {
// File srcFile = new File(srcFileName);
// // 判断源文件是否存在
// if (!srcFile.exists()) {
// log.error("源文件:" + srcFileName + "不存在!");
// return false;
// } else if (!srcFile.isDirectory()) {
// log.error("复制失败,源文件:" + srcFileName + "不是一个路径!");
// return false;
// }
// String month=
destFileName = destFileName
+ FilesUtil.getFormatDate();
log.info("备份路径:"+destFileName);
// 判断目标文件是否存在
File destFile = new File(destFileName);
if (!destFile.exists()) {
try {
boolean flag = destFile.mkdirs();
log.info("true or false:" + flag);
} catch (Exception e) {
e.printStackTrace();
}
}
// 复制文件
int byteread = 0; // 读取的字节数
InputStream in = null;
OutputStream out = null;
try {
if (null == Bfile || Bfile.length < 1) {
log.error("待复制的文件目录里面不存在文件.");
} else {
for (int i = 0; i < Bfile.length; i++) {
in = new FileInputStream(Bfile[i]);
out = new FileOutputStream(destFileName + "/"
+ Bfile[i].getName());
byte[] buffer = new byte[1024];
while ((byteread = in.read(buffer)) != -1) {
out.write(buffer, 0, byteread);
}
out.close();
in.close();
}
}
log.info("backup success!");
return true;
} catch (FileNotFoundException e) {
return false;
} catch (IOException e) {
return false;
} finally {
try {
if (out != null)
out.close();
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
第二种情况:
/*
* 把上面的方法改造
* 拷贝文件备份到对应的日期目录下,引用XmlCopyFile2方法;
*/
public static boolean copyFile2(File srcFile, String destFileName) {
boolean flag = false; // 判断源文件是否存在
if (!srcFile.exists()) {
log.error("源文件:" + srcFile + "不存在!");
return flag;
} flag = FilesUtil.XmlCopyFile2(destFileName, srcFile);
return flag;
} public static boolean XmlCopyFile2(String destFileName, File Bfile) { destFileName = destFileName + FilesUtil.getFormatDate();
log.info("备份路径:"+destFileName);
// 判断目标文件是否存在
File destFile = new File(destFileName);
if (!destFile.exists()) {
try {
boolean flag = destFile.mkdirs();
log.info("true or false:" + flag);
} catch (Exception e) {
e.printStackTrace();
}
}
// 复制文件
int byteread = 0; // 读取的字节数
InputStream in = null;
OutputStream out = null;
try { in = new FileInputStream(Bfile);
out = new FileOutputStream(destFileName + "/"
+ Bfile.getName());
byte[] buffer = new byte[1024];
while ((byteread = in.read(buffer)) != -1) {
out.write(buffer, 0, byteread);
}
out.close();
in.close(); log.info("backup success!");
return true;
} catch (FileNotFoundException e) {
return false;
} catch (IOException e) {
return false;
} finally {
try {
if (out != null)
out.close();
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
好了,以上就是普通的上传ftp和备份文件方法。
普通的java Ftp客户端的文件上传的更多相关文章
- Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题 swfUpload多文件上传
Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题(转) 我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的.通过使用某些技术手段,比如jqu ...
- 【Java】后台将文件上传至远程服务器
问题:由于系统在局域网(能访问外网)内,但外网无法请求局域网内服务器文件和进行处理文件. 解决:建立文件服务器,用于存储文件及外网调用. 客户端(文件上传): package cn.hkwl.lm.u ...
- JAVA Web 之 struts2文件上传下载演示(二)(转)
JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...
- JAVA Web 之 struts2文件上传下载演示(一)(转)
JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...
- java代码实现ftp服务器的文件上传和下载
java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools 工具类: ...
- Java实现FTP批量大文件上传下载篇1
本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...
- Java模拟客户端向服务器上传文件
先来了解一下客户端与服务器Tcp通信的基本步骤: 服务器端先启动,然后启动客户端向服务器端发送数据. 服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果. 客户端读取服务器发送 ...
- 我的代码库-Java8实现FTP与SFTP文件上传下载
有网上的代码,也有自己的理解,代码备份 一般连接windows服务器使用FTP,连接linux服务器使用SFTP.linux都是通过SFTP上传文件,不需要额外安装,非要使用FTP的话,还得安装FTP ...
- Java精选笔记_文件上传与下载
文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...
随机推荐
- 消息中间件——RabbitMQ(十)RabbitMQ整合SpringBoot实战!(全)
前言 1. SpringBoot整合配置详解 publisher-confirms,实现一个监听器用于监听Broker端给我们返回的确认请求:RabbitTemplate.ConfirmCallbac ...
- 对比JPA 和Hibernate 和 Mybatis的区别
1.JPA.Hibernate.Mybatis简单了解 1.JPA:本身是一种ORM规范,不是ORM框架.由各大ORM框架提供实现. 2.Hibernate:目前最流行的ORM框架,设计灵巧,文档丰富 ...
- k8s部署nacos
如果是在centos7上直接启动nacos 注意修改启动命令 sh startup.sh -m standalone 访问路径 http://********:8848/nacos/index.h ...
- NOI2000 青蛙过河[递推]
也许更好的阅读体验 \(\mathcal{Description}\) 原题链接: Comet OJ 洛谷 大小各不相同的一队青蛙站在河左岸的石墩(记为A)上,要过到对岸的石墩(记为D)上去.河心有几 ...
- Tomcat HTTP connector和AJP connector
Tomcat服务器通过Connector连接器组件与客户程序建立连接,“连接器”表示接收请求并返回响应的端点.即Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户. ...
- Consul基本使用
原文: Consul基本使用 date: 2019-05-13 17:01:37 前言 官网介绍Consul是一个分布式服务网格(Service Mesh)解决方案... 而我目前的理解是提供了分布式 ...
- 升级win10 1903版后,vmware打开虚拟机黑屏的解决办法
按照网上给的方法(1-3),又增加了几步(从4开始,只在我自己电脑上实践过): 1. 打开cmd,执行以下命令 netsh winsock reset 2. 重启电脑 3. 以管理员身份执行vmwar ...
- HTTP抓包实战
HTTP:超文本传输协议 允许将HTTP文档从Web服务器传送到客户端的浏览器.HTTP请求报文分为3部分.第一部分叫做起始行(Request line).第二部分叫首部(Request Header ...
- 天然气水电行业专用抄表器PDA现场打印通知单
传统的抄表工作是使用卡片记录,抄表工人不仅需要背着厚厚的卡片进行记录,回到电力局还需要有专门人员进行电脑录入,浪费了大量人力物力,而且各个环节上出错率比较高.电力专用抄表器的广泛应用使得电力抄表工作变 ...
- JS定时器做物体运动
JS定时器是函数 setInterval(函数体/函数名 , 时间) 清楚定时器 clearInterval(函数) 时间单位(毫秒) 1000毫秒 = 1秒 首先我们要知道用JS定时器能干什么? ...