普通的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 ...
随机推荐
- xsy 2412【BZOJ4569】【Scoi2016】萌萌哒
Description Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2, ...
- Python进阶:metaclass谈
metaclass 的超越变形特性有什么用? 来看yaml的实例: import yaml class Monster(yaml.YAMLObject): yaml_tag = u'!Monster' ...
- PAT(B) 1086 就不告诉你(Java)
题目链接:1086 就不告诉你 (15 point(s)) 题目描述 做作业的时候,邻座的小盆友问你:"五乘以七等于多少?"你应该不失礼貌地围笑着告诉他:"五十三.&qu ...
- MGR安装记录
装好所有MySQL5.7, 打开GTID 修改my.cnf文件: ## group replication transaction_write_set_extraction = XXHASH64 ## ...
- 血小板 live2d web使用
关于此插件 看到一个很多网站都有动态的小人,目前除了即将废弃的flash就是canvas和h5动画了,h5动画能力有限,不能画出复杂的效果 那么canvas就是首选,全部手画也不可能,大部分使用库和工 ...
- sprint boot websocket 服务端+html5 示例测试
包依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- collections.defaultdict()的使用
这里的defaultdict(function_factory)构建的是一个类似dictionary的对象,其中keys的值,自行确定赋值,但是values的类型,是function_factory的 ...
- python实现ssh及sftp功能
1.在Linux上我们通过scp命令实现主机间的文件传送,通过ssh实现远程登录 ,比如 我们经常使用的xshell远程登录工具,就是基础ssh协议实现window主机远程登录Linux主机 下面简单 ...
- 关于文本设置overflow:hidden后引起的垂直对齐问题
目前有这样的需求,一行标题中,前面为图标,后面是文字,文字要实现一行省略的效果 首先把文字设为:display: inline-block; 然后设置省略: overflow: hidden; wor ...
- 判断上传文件是否为excel
1. 可以在input上传组件上添加属性accept,这样上传文件的时候,就只能选择excel文件了. <input type="file" accept="app ...