关于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客户端的文件上传的更多相关文章

  1. Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题 swfUpload多文件上传

    Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题(转) 我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的.通过使用某些技术手段,比如jqu ...

  2. 【Java】后台将文件上传至远程服务器

    问题:由于系统在局域网(能访问外网)内,但外网无法请求局域网内服务器文件和进行处理文件. 解决:建立文件服务器,用于存储文件及外网调用. 客户端(文件上传): package cn.hkwl.lm.u ...

  3. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

  4. JAVA Web 之 struts2文件上传下载演示(一)(转)

    JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...

  5. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

  6. Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...

  7. Java模拟客户端向服务器上传文件

    先来了解一下客户端与服务器Tcp通信的基本步骤: 服务器端先启动,然后启动客户端向服务器端发送数据. 服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果. 客户端读取服务器发送 ...

  8. 我的代码库-Java8实现FTP与SFTP文件上传下载

    有网上的代码,也有自己的理解,代码备份 一般连接windows服务器使用FTP,连接linux服务器使用SFTP.linux都是通过SFTP上传文件,不需要额外安装,非要使用FTP的话,还得安装FTP ...

  9. Java精选笔记_文件上传与下载

    文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...

随机推荐

  1. SAS学习笔记56 ODS ESCAPECHAR

    这种内嵌格式独立于style型和table型,它既可以结合二者使用,也可以独立使用.它主要通过下列语句的格式形式来进行调用: ODS ESCAPECHAR ‘^’; 上述符号’^’表示触发条件,如果碰 ...

  2. Python之算法模型-5.1

    一.这里学习的算法模型包含监督学习和非监督学习两个方式的算法. 其中监督学习的主要算法分为(分类算法,回归算法),无监督学习(聚类算法),这里的几种算法,主要是学习他们用来做预测的效果和具体的使用方式 ...

  3. sqlserver2008+日志收缩sql语句命令

    USE[master] GO ALTER DATABASE 数据库 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE 数据库 SET RECOVER ...

  4. Springboot笔记01——Springboot简介

    一.什么是微服务 在了解Springboot之前,首先我们需要了解一下什么是微服务. 微服务是一种架构风格(服务微化),是martin fowler在2014年提出来的.微服务简单地说就是:一个应用应 ...

  5. TCP粘包/拆包(Netty权威指南)

    无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个“流”协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连成一片 ...

  6. 11/8 (tell tales web)

    1.visual perception gestalt theory:格式塔学派是心理学重要流派之一,兴起于20世纪初的德国,又称为完形心理学.由马科斯·韦特墨.沃尔夫冈·苛勒和科特·考夫卡三位德国心 ...

  7. js控制台不同的打印方式

    在控制台单个输出: console.log(...):值 console.info(...):信息 console.debug(...):调试信息 console.warn(...):警告信息 con ...

  8. 用BIO手写实现Redis客户端的探究(拒绝Jedis)

    在Redis的使用过程中,大多数人都是使用现成的客户端,如Jedis,Redisson,Lettuce.因此本文研究用BIO的方式手写Redis客户端尝试,对遇到的问题进行探究及总结. Redis通讯 ...

  9. c语言int类型的变量输入一个字符出错

    今天遇到一个C语言的小问题,就是写一个简单的计算器,定义一个%f%c%f的三个变量,作2+3,2-3这种可以不断输入并输入“OFF”跳出循环的计算器功能,便会出现错误: 错误的示例代码如下: #inc ...

  10. CentOS7 安装记录

    起因是想自建一个本地笔记云存储,按照网上的教程搭建,卡在了其中的一个步骤上(文章见https://www.laobuluo.com/1542.html),卡在了如下图的位置,google了一番解决的办 ...