完整程序FTP上传
package com.zhcw.update.msisdn;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
/**
* Title: FTP上传功能类
* Description: FTP上传功能类
* Copyright: Copyright (c) 2012
* Company: 北京世纪国彩科技有限公司
*
* @author chenchuang
* @version 1.0
*/
public class FtpUtil {
private String ip="";
private String username="";
private String password="";
private int port=-1;
private String path="";
FtpClient ftpClient=null;
OutputStream os=null;
FileInputStream is=null;
public FtpUtil(String serverIp ,String username,String password){
this.ip=serverIp;
this.username=username;
this.password=password;
}
public FtpUtil(String serverIp , int port,String username,String password){
this.ip=serverIp;
this.port=port;
this.username=username;
this.password=password;
}
public static void main(String args[]){
FtpUtil ftp=new FtpUtil("172.16.10.142","admin","adminly");
ftp.connectServer();
boolean result=ftp.upload("C:/Documents and Settings/SJKC/桌面/java/cc.txt", "cc.txt");
// boolean result=ftp.downloadFile("C:/Documents and Settings/SJKC/桌面/java/cc.txt", "cc.txt");
System.out.println(result ? "上传成功!" : "上传失败!");
ftp.closeServer();
}
/**
* ftp上传 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
* @param fileName 要上传的文件(或文件夹)名
* @param newName 服务器端要生成的文件(或文件夹)名
* @return
*/
public boolean upload(String fileName,String newName){
try{
String savefilename=new String(fileName.getBytes("GBK"),"GBK");
File file_in = new File(savefilename);// 打开本地待长传的文件
if (!file_in.exists()) {
throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");
}
if (file_in.isDirectory()) {
upload(file_in.getPath(), newName, ftpClient.pwd());
} else {
uploadFile(file_in.getPath(), newName);
}
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
return true;
} catch (Exception e) {
e.printStackTrace();
System.err.println("Exception e in Ftp upload(): " + e.toString());
return false;
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 真正用于上传的方法
* @param fileName
* @param newName
* @param path
*/
private void upload(String fileName, String newName, String path) throws Exception{
String savefilename=new String(fileName.getBytes("ISO-8859-1"),"GBK");
File file_in=new File(savefilename);//打开本地待上传的文件
if(!file_in.exists()){
throw new Exception("此文件或文件夹["+file_in.getName()+"]有误或不存在!");
}
if(file_in.isDirectory()){
if(!isDirExist(newName)){
createDir(newName);
}
ftpClient.cd(newName);
File sourceFile[]=file_in.listFiles();
for(int i=0;i<sourceFile.length;i++){
if(!sourceFile[i].exists()){
continue;
}
if(sourceFile[i].isDirectory()){
this.upload(sourceFile[i].getPath(),sourceFile[i].getName(),path+"/"+newName);
}else{
this.upload(sourceFile[i].getPath(),sourceFile[i].getName());
}
}
}else{
uploadFile(file_in.getPath(),newName);
}
ftpClient.cd(path);
}
/**
* 在当前目录下创建文件夹
* @param dir
* @return
*/
private boolean createDir(String dir){
try{
ftpClient.ascii();//转换到字符模式下
StringTokenizer s=new StringTokenizer(dir,"/");//sign(记号,符号)
s.countTokens();
/**
* countTokens
public int countTokens()计算在生成异常之前可以调用此 tokenizer 的 nextToken 方法的次数。当前位置没有提前。
返回:
使用当前分隔符集的字符串中剩余的标记数。
以上是API中的说明,
我写了一个小程序:
import java.util.*;
public class Tokenizer{
public static void main(String[] args){
StringTokenizer a = new StringTokenizer("a b c");
System.out.println(a.countTokens());
}
}
程序执行的结果是3,因为a b c采用默认的分隔符分隔,一共有a,b,c三个token,所以countTokens()的结果是3
*/
String pathName=ftpClient.pwd();
while(s.hasMoreElements()){
pathName=pathName+"/"+(String)s.nextElement();
try{
ftpClient.sendServer("MKD "+pathName+"\r\n");
}catch(Exception e){
e=null;
return false;
}
ftpClient.readServerResponse();
}
ftpClient.binary();
return true;
}catch(IOException ee){
ee.printStackTrace();
return false;
}
}
/**
* 连接ftp服务器
* @return
*/
public boolean connectServer(){
ftpClient=new FtpClient();
try{
if(this.port!=-1){
ftpClient.openServer(this.ip,this.port);
}else{
ftpClient.openServer(this.ip);
}
ftpClient.login(this.username, this.password);
if(this.path.length()!=0){
ftpClient.cd(this.path);//path是ftp服务下主目录的子目录
}
ftpClient.binary();//使用二进制上传与下载
System.out.println("已登录到\""+ftpClient.pwd()+"\"目录");
return true;
}catch(IOException e){
e.printStackTrace();
return false;
}
}
/**
* 断开与ftp服务器的连接
* @return
*/
public boolean closeServer(){
try{
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
if(ftpClient!=null){
ftpClient.closeServer();
}
System.out.println("已与服务器断开连接");
return true;
}catch(IOException e){
e.printStackTrace();
return false;
}
}
/**
* 检查文件在当前目录下是否存在
* @param dir
* @return
*/
private boolean isDirExist(String dir){
String pwd="";
try{
pwd=ftpClient.pwd();
ftpClient.cd(dir);
ftpClient.cd(pwd);
}catch(Exception e){
e.printStackTrace();
return false;
}
return true;
}
/**
* ftp上传 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
* @param filename 要上传的文件(或文件夹)名
* @return
*/
public boolean upload(String filename){
String newname="";
if(filename.indexOf("/")>-1){
newname=filename.substring(filename.lastIndexOf("/")+1);
}else{
newname=filename;
}
return upload(filename,newname);
}
/**
* upload 上传文件
* @param filename 要上传的文件名
* @param newname 上传后的新文件名
* @return -1 文件不存在 >=0 成功上传,返回文件的大小
* @throws Exception
*/
public long uploadFile(String filename, String newname) throws Exception {
long result = 0;
TelnetOutputStream os = null;
FileInputStream is = null;
try {
java.io.File file_in = new java.io.File(filename);
if (!file_in.exists())
return -1;
os = ftpClient.put(newname);
result = file_in.length();
is = new FileInputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
return result;
}
/**
* 从ftp下载文件到本地
*
* @param filename 服务器上的文件名
* @param newfilename 本地生成的文件名
* @return
* @throws Exception
*/
public long downloadFile(String filename, String newfilename) {
long result = 0;
TelnetInputStream is = null;
FileOutputStream os = null;
try {
is = ftpClient.get(filename);
java.io.File outfile = new java.io.File(newfilename);
os = new FileOutputStream(outfile);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
result = result + c;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 取得相对于当前连接目录的某个目录下所有文件列表
*
* @param path
* @return
*/
@SuppressWarnings({ "unchecked", "deprecation" })
public List getFileList(String path){
List list = new ArrayList();
DataInputStream dis;
try {
dis = new DataInputStream(ftpClient.nameList(this.path + path));
String filename = "";
while ((filename = dis.readLine()) != null) {
list.add(filename);
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}