关于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
// 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 numList = new ArrayList();
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 booleancopyFile2(File srcFile, String destFileName) {boolean flag = false;//判断源文件是否存在
if (!srcFile.exists()) {
log.error("源文件:" + srcFile + "不存在!");returnflag;
}
flag=FilesUtil.XmlCopyFile2(destFileName, srcFile);returnflag;
}public static booleanXmlCopyFile2(String destFileName, File Bfile) {
destFileName= destFileName +FilesUtil.getFormatDate();
log.info("备份路径:"+destFileName);//判断目标文件是否存在
File destFile = newFile(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= newFileInputStream(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和备份文件方法。