import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.ftp.FtpClient;
/**
* ftp上传、下载文件夹
*
* @author yunian
*
*/
public class FtpTool {
private String ip = "XX.XX.XXX.XXX";// ftp服务器的IP地址
private String username = "XXX";// 用户名
private String password = "XXX";// 密码
private int port = 21;// 默认端口
private String localfilefullname = "";// 需要上传的目录,带绝对路径
FtpClient ftpclient = null;
OutputStream os = null;
FileInputStream is = null;
/**
* 创建文件夹
*
* @param dir
* @param ftpclient
* @throws exception
*/
private void createdir(String dir, FtpClient ftpclient) throws Exception {
ftpclient.ascii();
StringTokenizer s = new StringTokenizer(dir, "/"); //
s.countTokens();
String pathname = "";
while (s.hasMoreElements()) {
pathname = pathname + "/" + (String) s.nextElement();
try {
ftpclient.sendServer("mkd " + pathname + "\r\n");// 如果服务器上有该目录,不会被创建
} catch (Exception e) {
e = null;
}
ftpclient.readServerResponse();
}
ftpclient.binary();
}
/**
* 检查文件夹是否存在
*
* @param dir
* @param ftpclient
* @return
*/
private boolean isdirexist(String dir, FtpClient ftpclient)
throws Exception {
try {
ftpclient.cd(dir);
} catch (Exception e) {
// todo 自动生成 catch 块
return false;
}
return true;
}
/**
* ftp上传
*
* @param localfilefullname
* 上传的源文件夹
* @return
*/
public boolean upload(String prefix, String localfilefullname)
throws Exception {
this.localfilefullname = localfilefullname;
try {
String savefilename = localfilefullname;
// 新建一个ftp客户端连
ftpclient = new FtpClient();
ftpclient.openServer(this.ip, this.port);
ftpclient.login(this.username, this.password);
// 打开本地待长传的文件
File file_in = new File(savefilename);
processfile(prefix, file_in, ftpclient);
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpclient != null) {
ftpclient.closeServer();
}
return true;
} catch (Exception e) {
e.printStackTrace();
System.err.println("exception e in ftp upload(): " + e.toString());
return false;
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpclient != null) {
ftpclient.closeServer();
}
}
}
/**
* 上传文件,递归算法,如果是目录且服务器上不存在该目录则在服务器上创建该目录,一级一级往下找,找到目录下的文件则读取文件内容,上传到服务器上
*
* @param source
* @param ftpclient
* @throws exception
*/
private void processfile(String prefix, File source, FtpClient ftpclient)
throws Exception {
if (source.exists()) {
if (source.isDirectory()) {
String path = prefix
+ source.getPath()
.substring(localfilefullname.length()).replace(
"\\", "/");
if (!isdirexist(path, ftpclient)) {
createdir(path, ftpclient);
}
File sourcefile[] = source.listFiles();
for (int i = 0; i < sourcefile.length; i++) {
if (sourcefile.exists()) {
if (sourcefile.isDirectory()) {
this.processfile(prefix, sourcefile, ftpclient);
} else {
ftpclient.cd(cheangpath(prefix, sourcefile
.getPath()));
ftpclient.binary();
os = ftpclient.put(sourcefile.getName());
byte[] bytes = new byte[1024];
is = new FileInputStream(sourcefile);
// 开始复制
int c;
// 暂未考虑中途终止的情况
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
is.close();
os.close();
}
}
}
} else {
ftpclient.cd(cheangpath(prefix, source.getPath()));
ftpclient.binary();
os = ftpclient.put(source.getName());
byte[] bytes = new byte[1024];
is = new FileInputStream(source);
// 开始复制
int c;
// 暂未考虑中途终止的情况
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
is.close();
os.close();
}
} else {
throw new Exception("此文件或文件夹[" + source.getName() + "]有误或不存在!");
}
}
/**
* 获取当前的ftp路径
*
* @param path
* @return
*/
private String cheangpath(String prefix, String path) throws Exception {
path = path.substring(localfilefullname.length()).replace("\\", "/");
if ("".equals(path)) {
path = "/";
} else {
path = path.substring(0, path.lastIndexOf("/") + 1);
}
path = prefix + path;
return path;
}
/**
* 递归算法,取得文件的字节大小
*
* @param strName
* 文件名带绝对路径
* @return
*/
public Long getSize(String strName) {
Long TotalSize = 0L;
File f = new File(strName);
if (f.isFile())
return f.length();
else {
if (f.isDirectory()) {
File[] contents = f.listFiles();
for (int i = 0; i < contents.length; i++) {
if (contents.isFile())
TotalSize += contents.length();
else {
if (contents.isDirectory())
TotalSize += getSize(contents.getPath());
}
}
}
}
return TotalSize;
}
/**
* 递归下载文件
*
* @param localPath
* @param remotePath
*/
public void processdownload(String localPath, String remotePath) {
FileOutputStream outStream = null;
ArrayList list = null;
try {
list = getFileList(remotePath);
ftpclient.binary();
File temp = null;
for (int i = 0; i < list.size(); i++) {
// 如果是文件,则直接执行下载
if (isFile(list.get(i).toString())) {
ftpclient.cd(remotePath);
ArrayList listfileName = getNameList(remotePath);
for (int j = 0; j < listfileName.size(); j++) {
temp = new File(localPath + File.separator
+ listfileName.get(j).toString());
outStream = new FileOutputStream(temp);
TelnetInputStream is = ftpclient.get(listfileName
.get(j).toString());
byte[] bytes = new byte[1024];
int c;
// 暂未考虑中途终止的情况
while ((c = is.read(bytes)) != -1) {
outStream.write(bytes, 0, c);
}
is.close();
outStream.close();
System.out.println("成功下载文件:" + remotePath
+ File.separator
+ listfileName.get(j).toString());
}
} else if (isDir(list.get(i).toString()))// 是目录
{
temp = new File(localPath + File.separator
+ getFileName(list.get(i).toString()));
temp.mkdirs();
String newRemote = remotePath + File.separator
+ getFileName(list.get(i).toString());
processdownload(localPath + File.separator
+ getFileName(list.get(i).toString()), newRemote);
}
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
outStream.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 返回文件夹或者文件的名称
*
* @param line
* @return
*/
public String getFileName(String line) {
String filename = (String) parseLine(line).get(8);
return filename;
}
/**
* 返回当前目录的文件名称
*
* @return
* @throws IOException
*/
public ArrayList getNameList(String remotePath) throws IOException {
BufferedReader dr = new BufferedReader(new InputStreamReader(ftpclient
.nameList(remotePath)));
ArrayList al = new ArrayList();
String s = "";
while ((s = dr.readLine()) != null) {
System.out.println("filename:" + s);
al.add(s);
}
return al;
}
/**
* 返回当前目录的所有文件及文件夹
*
* @return
* @throws IOException
*/
public ArrayList getFileList(String remotePath) throws IOException {
ftpclient.cd(remotePath);
BufferedReader dr = new BufferedReader(new InputStreamReader(ftpclient
.list()));
ArrayList al = new ArrayList();
String s = "";
while ((s = dr.readLine()) != null) {
System.out.println("readLine:" + s);
if ((!((String) parseLine(s).get(8)).equals("."))
&& (!((String) parseLine(s).get(8)).equals(".."))) {
al.add(s);
System.out.println("s:" + s);
}
}
return al;
}
/**
* 判断一行文件信息是否为目录
*
* @param line
* @return
*/
public boolean isDir(String line) {
return ((String) parseLine(line).get(0)).indexOf("d") != -1;
}
public boolean isFile(String line) {
return !isDir(line);
}
/**
* 处理getFileList取得的行信息
*
* @param line
* @return
*/
private ArrayList parseLine(String line) {
ArrayList s1 = new ArrayList();
StringTokenizer st = new StringTokenizer(line, " ");
while (st.hasMoreTokens()) {
s1.add(st.nextToken());
}
return s1;
}
/**
* ftp下载文件
*
* @param localPath
* @param remotePath
* @return
* @throws Exception
*/
public boolean download(String localPath, String remotePath)
throws Exception {
this.localfilefullname = localfilefullname;
try {
String savefilename = localfilefullname;
// 新建一个ftp客户端连
ftpclient = new FtpClient();
ftpclient.openServer(this.ip, this.port);
ftpclient.login(this.username, this.password);
ftpclient.cd(remotePath);
processdownload(localPath, remotePath);
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpclient != null) {
ftpclient.closeServer();
}
return true;
} catch (Exception e) {
e.printStackTrace();
System.err.println("exception e in ftp upload(): " + e.toString());
return false;
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpclient != null) {
ftpclient.closeServer();
}
}
}
public static void main(String args[]) throws Exception {
FtpTool ftpup = new FtpTool();
String path = "E:/test2/test";
if (ftpup.getSize(path) > 204800) {
System.out.println("您上传的文件过大,文件大小不能大于200k!");
return;
}
// ftpup.upload("/02", path);
ftpup.download("c:\\test", "/52601/20090612/bonc20090612095616");
}
}
java实现ftp上传与下载(比较全面)
最新推荐文章于 2024-08-09 23:54:28 发布