java ftp上传文件_普通的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

// 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和备份文件方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值