`

Apache net自己写的FTP上传整个"目录"的代码(测试通过)(最终修订版)

阅读更多

      上一篇中的那个FTP上传的代码只是适合Window下面的,而今天这个改进就可以即适合Window下,也适合Linux下了。因为我们做的CMS系统是放到Linux下面的,所以当时欠缺考虑,才导致后面的很多的麻烦。

     另外我还想在说一点:(1)String ftpWorkingPath = ftpClient.printWorkingDirectory(); 这里是在FTP上打印出当时的路径,也不知道是什么原因FTP默认的把大写的字母全部转化成小写的了,这点是我以前不知道的,也是我从新遇到的新的问题当时一直在找原因,结果被我发现是这个大小写的原因。(2)所以最后要比较equals的话就必须都转化成小写的字母来比较和来截取都必须统一的用小写或者统一的用大写。例如:

int firstIndex = ftpWorkingPath.trim().toLowerCase().indexOf(webSiteName.trim().toLowerCase());

 

另外还要去掉空格trim(),以前的代码没有用这些,当时没有报错或者错位(也不知道是什么原因没有报错或者错位),但是这次有出现错位,所以在找原因,最后发现是大小写原因。以前的代码是:

int firstIndex = ftpWorkingPath.indexOf(webSiteName);

 

因为ftpWorkingPath=“/windowtest/aa/bb/cc/” ,而webSiteName="windowTest",所以firstIndex=-1,这个就是最终的原因所在了。(3)另外还有就是在"(指针)跳到上层目录"的时候:

if(finalTarget.trim().toLowerCase().equals(ftpWorkingPath.trim().toLowerCase())){
	System.out.println("jumping again ...");	ftpClient.changeToParentDirectory();
}

 一定要大小写一致。

 

下面是所有的FTP上传整个目录或者项目代码:当然这是最核心的代码,另外还有些相关的代码我没有粘贴出来,如果有需要的朋友可以找到我的QQ。

//window and linux
	public void uploadManyFile(FTPClient ftpClient,File localFilePath,String localPath,String webSiteName){
		try{
			System.out.println(localFilePath.getName()+"*******");
			System.out.println("localPath:"+localPath);
			System.out.println("localFilePath:"+localFilePath.getName()+"-"+localFilePath.getAbsolutePath());
			System.out.println("webSiteName:"+webSiteName);
			
			File fileList[] = localFilePath.listFiles();
			//null directory
			if(fileList.length <= 0){
				ftpClient.changeToParentDirectory();
				System.out.println("AbsolutePathList Size 1:"+AbsolutePathList!=null?AbsolutePathList.size():null);
				for(int m=0;m<AbsolutePathList.size();m++){
					for(int k=0;k<AbsolutePathList.size();k++){
						String target = AbsolutePathList.get(k).substring(localPath.length()-2, AbsolutePathList.get(k).length());
						int sign = target.lastIndexOf(fileName.get(k));
						String finalTarget = target.substring(0, sign-1);
						finalTarget = finalTarget.replace("\\", "");
						String ftpWorkingPath = ftpClient.printWorkingDirectory();
						if(ftpWorkingPath.length() > webSiteName.length()){
							int firstIndex = ftpWorkingPath.trim().toLowerCase().indexOf(webSiteName.trim().toLowerCase());
							ftpWorkingPath = ftpWorkingPath.substring(firstIndex+webSiteName.length(), ftpWorkingPath.length());
						}
						ftpWorkingPath = ftpWorkingPath.replace("/", "");
						System.out.println("target"+k+"="+target+" sign="+sign+" finalTarget="+finalTarget);
						System.out.println("ftpWorkingPath"+k+"="+ftpWorkingPath);
						if(finalTarget.trim().toLowerCase().equals(ftpWorkingPath.trim().toLowerCase())){
							System.out.println("jumping again");
							ftpClient.changeToParentDirectory();
						}
					}
				}
			}
			for(int i=0;i<fileList.length;i++){
				File upfile = (File)fileList[i];
				if(upfile.isDirectory()){
					System.out.println(upfile.getName()+"---");
					System.out.println("jinlai");
					if(i+1 == fileList.length){
						System.out.println("aa3-absolute="+upfile.getAbsolutePath());
						AbsolutePathList.add(upfile.getAbsolutePath());
						fileName.add(upfile.getName());
					}
					ftpClient.makeDirectory(upfile.getName());
					ftpClient.changeWorkingDirectory(upfile.getName());
					uploadManyFile(ftpClient,upfile,localPath,webSiteName);
				}else{
					System.out.println(localFilePath.getName()+"****&&***");
					System.out.println(upfile.getName()+"--+++");
					System.out.println(localFilePath.getPath()+"\\"+upfile.getName());
					String localFileRealPath = localFilePath.getPath()+"/"+upfile.getName();
					uploadRealFile(ftpClient,new File(localFileRealPath));
					System.out.println("i="+ i);
					System.out.println("fileList.length="+fileList.length);
					if(i+1 == fileList.length){
						ftpClient.changeToParentDirectory();
						for(int m=0;m<AbsolutePathList.size();m++){
							for(int k=0;k<AbsolutePathList.size();k++){
								System.out.println("localPath="+localPath+" AbsolutePathList.get(0)="+AbsolutePathList.get(0));
								String target = AbsolutePathList.get(k).substring(localPath.length()-2, AbsolutePathList.get(k).length());
								System.out.println("target="+target);
								int sign = target.lastIndexOf(fileName.get(k));
								System.out.println("fileName.get(0)="+fileName.get(0)+" sign="+sign);
								String finalTarget = target.substring(0, sign-1);
								finalTarget = finalTarget.replace("\\", "");
								System.out.println("finalTarget="+finalTarget);
								String ftpWorkingPath = ftpClient.printWorkingDirectory();
								System.out.println("ftpWorkingPath1="+ftpWorkingPath);
								if(ftpWorkingPath.length() > webSiteName.length()){
									System.out.println("webSiteName====="+k+webSiteName);
									int firstIndex = ftpWorkingPath.trim().toLowerCase().indexOf(webSiteName.trim().toLowerCase());
									System.out.println("firstIndex="+firstIndex+" webSiteName="+webSiteName+" webSiteName.length="+webSiteName.length());
									ftpWorkingPath = ftpWorkingPath.trim().toLowerCase().substring(firstIndex+webSiteName.length(), ftpWorkingPath.length());
								}
								ftpWorkingPath = ftpWorkingPath.replace("/", "");
								System.out.println("ftpWorkingPath3="+ftpWorkingPath);
								if(finalTarget.trim().toLowerCase().equals(ftpWorkingPath.trim().toLowerCase())){
									System.out.println("jumping again ...");
									ftpClient.changeToParentDirectory();
								}
							}
						}
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

      我利用上面的代码来上传到FTP服务器上,可以上传成功但是当我运行时就不能运行了,因为我上传的模板是可以放到Tomcat下面跑起来的,结果它总是报告错误。郁闷中....  如何发现问题的原因的?这才是问题的重点为什么我能想到是传输过程中没有设置传输的格式类型呢? 那是因为我在FTP上打开我传输的JAR包结果发现总是报告文件损坏,所有就想到了问题的解决办法了。 后来我发现了问题所在:是代码的问题,缺少了以下代码:

 

this.connectServer();
this.setFileType(FTP.BINARY_FILE_TYPE);

/**
 * 设置传输文件的类型[文本文件或者二进制文件]
* 
 * @param fileType
*            --BINARY_FILE_TYPE、ASCII_FILE_TYPE
 */
public void setFileType(int fileType) {
	try {
		ftpClient.setFileType(fileType);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

      前面的代码放在Linux下面运行,还是出现了一些小问题:然后开始寻找错误的原因,其中一点是:(1)为了和Windows、Linux下面都兼容,所以我加入了以下代码:

if(i+1 == fileList.length){
	System.out.println("aa3-absolute="+upfile.getAbsolutePath());
	if(upfile.getAbsolutePath().indexOf("/") == 0){
		AbsolutePathList.add(upfile.getAbsolutePath());
	}else{
		String newStr = "";
		StringBuffer sb = new StringBuffer(newStr);
		newStr = sb.append("/").append(upfile.getAbsolutePath()).toString();
		AbsolutePathList.add(newStr);
	}
	fileName.add(upfile.getName());
}

 

(1)添加上述代码的原因是:我在打印的结果中发现
localPath=/usr/local/jboss-4.2.2.GA/server/default/deploy/cms-ear.ear/cms.war/website/LinuxTest/
AbsolutePathList.get(k)=/usr/local/jboss-4.2.2.GA/server/default/deploy/cms-ear.ear/cms.war/website/LinuxTest/WEB-INF/classes/cn/ctit/cms/service/webapp
如果是windows的话:
AbsolutePathList.get(k)=usr/local/jboss-4.2.2.GA/server/default/deploy/cms-ear.ear/cms.war/website/LinuxTest/WEB-INF/classes/cn/ctit/cms/service/webapp
所以才加了上面的代码。

 

第二点发现的问题是:(2)在Linux下面还出现了错位。原因:我又加入了以下代码:

finalTarget = finalTarget.replace("\\", "");
finalTarget = finalTarget.replace("/", ""); //多加了这么一行,这也是和linux下面兼容
(2)加入上述代码原因:
finalTarget = finalTarget.replace("\\", ""); 
finalTarget = finalTarget.replace("/", "");
上面那个仅仅是替换掉Windows下面的斜杠,但是Linux下面没有替换,所以才加入了下面那个代码。

  

最后终于测试通过了,哈哈。所有的代码如下:下面的代码才是真正的适合Windows和Linux的FTP上传的代码。

//window and linux
	public void uploadManyFile(FTPClient ftpClient,File localFilePath,String localPath,String webSiteName){
		try{
			File fileList[] = localFilePath.listFiles();
			//exist null directory
			if(fileList.length <= 0){
				ftpClient.changeToParentDirectory();
				for(int m=0;m<AbsolutePathList.size();m++){
					for(int k=0;k<AbsolutePathList.size();k++){
						String target = AbsolutePathList.get(k).substring(localPath.length()-1, AbsolutePathList.get(k).length());
						int sign = target.lastIndexOf(fileName.get(k));
						String finalTarget = target.substring(0, sign-1);
						finalTarget = finalTarget.replace("\\", "");
						String ftpWorkingPath = ftpClient.printWorkingDirectory();
						if(ftpWorkingPath.length() > webSiteName.length()){
							int firstIndex = ftpWorkingPath.trim().toLowerCase().indexOf(webSiteName.trim().toLowerCase());
							ftpWorkingPath = ftpWorkingPath.substring(firstIndex+webSiteName.length(), ftpWorkingPath.length());
						}
						ftpWorkingPath = ftpWorkingPath.replace("/", "");
						System.out.println("target"+k+"="+target+" sign="+sign+" finalTarget="+finalTarget);
						System.out.println("ftpWorkingPath"+k+"="+ftpWorkingPath);
						if(finalTarget.trim().toLowerCase().equals(ftpWorkingPath.trim().toLowerCase())){
							System.out.println("jumping again");
							ftpClient.changeToParentDirectory();
						}
					}
				}
			}
			for(int i=0;i<fileList.length;i++){
				File upfile = (File)fileList[i];
				if(upfile.isDirectory()){
					System.out.println(upfile.getName()+"---");
					System.out.println("jinlai");
					if(i+1 == fileList.length){
						System.out.println("aa3-absolute="+upfile.getAbsolutePath());
						if(upfile.getAbsolutePath().indexOf("/") == 0){
							AbsolutePathList.add(upfile.getAbsolutePath());
						}else{
							String newStr = "";
							StringBuffer sb = new StringBuffer(newStr);
							newStr = sb.append("/").append(upfile.getAbsolutePath()).toString();
							AbsolutePathList.add(newStr);
						}
						fileName.add(upfile.getName());
					}
					ftpClient.makeDirectory(upfile.getName());
					ftpClient.changeWorkingDirectory(upfile.getName());
					uploadManyFile(ftpClient,upfile,localPath,webSiteName);
				}else{
					System.out.println(localFilePath.getName()+"****&&***");
					System.out.println(upfile.getName()+"--+++");
					System.out.println(localFilePath.getPath()+"/"+upfile.getName());
					String localFileRealPath = localFilePath.getPath()+"/"+upfile.getName();
					uploadRealFile(ftpClient,new File(localFileRealPath));
					System.out.println("i="+ i);
					System.out.println("fileList.length="+fileList.length);
					if(i+1 == fileList.length){
						ftpClient.changeToParentDirectory();
						for(int m=0;m<AbsolutePathList.size();m++){
							for(int k=0;k<AbsolutePathList.size();k++){
								System.out.println("localPath="+localPath+" AbsolutePathList.get(0)="+AbsolutePathList.get(0));
								System.out.println("AbsolutePathList.get(k)="+AbsolutePathList.get(k)+"  k="+k+"  localPath.length()="+localPath.length());
								String target = AbsolutePathList.get(k).substring(localPath.length()-1, AbsolutePathList.get(k).length());
								System.out.println("target="+target);
								int sign = target.lastIndexOf(fileName.get(k));
								System.out.println("sign="+sign);
								String finalTarget = target.substring(0, sign-1);
								finalTarget = finalTarget.replace("\\", "");
								finalTarget = finalTarget.replace("/", "");
								System.out.println("finalTarget="+finalTarget);
								String ftpWorkingPath = ftpClient.printWorkingDirectory();
								System.out.println("ftpWorkingPath1="+ftpWorkingPath);
								if(ftpWorkingPath.length() > webSiteName.length()){
									System.out.println("webSiteName====="+webSiteName);
									int firstIndex = ftpWorkingPath.trim().toLowerCase().indexOf(webSiteName.trim().toLowerCase());
									System.out.println("firstIndex="+firstIndex+" webSiteName="+webSiteName+" webSiteName.length="+webSiteName.length());
									ftpWorkingPath = ftpWorkingPath.trim().toLowerCase().substring(firstIndex+webSiteName.length(), ftpWorkingPath.length());
								}
								ftpWorkingPath = ftpWorkingPath.replace("/", "");
								System.out.println("ftpWorkingPath3="+ftpWorkingPath);
								if(finalTarget.trim().toLowerCase().equals(ftpWorkingPath.trim().toLowerCase())){
									System.out.println("jumping again ...");
									ftpClient.changeToParentDirectory();
								}
							}
						}
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

 

分享到:
评论

相关推荐

    apache实现ftp上传

    apache实现ftp上传 Apache commons-net 库提供了一个功能强大且灵活的 FTP 客户端工具,能够满足各种 FTP 操作需求。在本文中,我们将探索如何使用 Apache commons-net 库实现 FTP 上传功能。 FTP 客户端工具 ...

    apache FTPserver 安装包

    Apache FTPServer是一款开源的FTP服务器软件,它是Apache软件基金会的一部分,设计用于提供可靠且高效的文件传输服务。在本文中,我们将深入探讨如何安装和配置Apache FTPServer,以及它的一些核心特性。 首先,让...

    ApacheCamel-FTP

    在提供的 "03-ApacheCamel-FTP" 压缩包文件中,可能包含了一些关于如何使用 Apache Camel FTP 组件的示例代码或配置文件。这些示例可以帮助初学者快速理解和实践 FTP 组件的功能。通常,示例可能涵盖以下方面: 1. *...

    Apache FtpServer配置详解

    从零开始介绍Apache FtpServer,并一步一步教你配置Apache FtpServer,更高级的应用,教你用写代码控制Apache FtpServer及集成到自己的应用中 &lt;!--ftp端口 --&gt; &lt;!--绑定的服务器IP地址,多网卡的时候使用...

    apache ftpserver笔记

    Apache FTPServer是一款开源的FTP服务器软件,它是Apache MINA项目的一部分,用于构建高性能、可扩展的网络应用。这篇笔记主要围绕Apache FTPServer的使用、配置和相关开发进行讲解。 首先,Apache FTPServer提供了...

    基于Apache FtpServer 的Ftp服务器实现

    Apache FtpServer是一款开源的FTP服务器软件,它基于Java语言开发,可以轻松地与各种Java应用集成。在本场景中,我们重点讨论如何利用Apache FtpServer与Spring框架集成来搭建一个功能强大的FTP服务器。 首先,...

    ftp上传下载java代码

    本篇将详细介绍如何使用Java实现FTP文件上传和下载,并提供相关的代码示例。 一、Java FTP基础 1. Java内置的FTP支持:Java的标准库`java.net.FTPURLConnection`提供了对FTP的基本支持,但它的API相对简单,功能...

    Apache Ftpserver 全套

    Apache Ftpserver是一款开源的FTP服务器软件,由Apache软件基金会维护。它提供了高度可配置性和模块化设计,使得用户可以根据需求定制自己的FTP服务环境。在本资料包中,你将获得Apache Ftpserver的全套资源,包括...

    apache FTP 工具类

    通过这个类,我们可以连接到FTP服务器,执行登录、创建/删除目录、上传/下载文件、改变工作目录等一系列操作。 **2. 连接与登录** 在使用FTPClient进行任何操作之前,需要先建立连接并登录。这通常涉及以下步骤: ...

    ftp上传下载源代码

    FTP(File Transfer Protocol)是一种基于TCP/IP协议的网络协议,用于在网络上进行...以上是FTP上传下载源代码中可能涉及的关键知识点,通过学习和理解这些代码,开发者可以掌握如何在Java环境中实现FTP客户端功能。

    Apache_FtpServer配置详解

    Apache_FtpServer配置详解

    apache_ftp 开发包

    然后,可以通过Apache Commons Net提供的`FTPClient`和`FTPSClient`类来创建FTP客户端,实现文件上传、下载、删除等操作。对于服务器端,可以利用FTPServer API来配置和启动FTP服务,设置用户权限,以及处理客户端...

    org.apache.commons.net.ftp

    通过这些类和接口,开发者可以轻松地构建自己的FTP客户端应用程序,实现复杂的文件传输逻辑。Apache Commons Net库的API设计得非常直观,使得理解和使用变得简单,大大减少了处理网络协议时的复杂性。确保在项目中...

    apache ftpserver讲解

    ### Apache FTP Server 使用详解 #### 背景介绍 在当今的数据传输领域,FTP (File Transfer Protocol) 作为一项成熟的技术被广泛应用于文件传输场景。Apache FTP Server 是一个基于 Java 的开源 FTP 服务器,它...

    apache ftp工具所需jar

    Apache FTP工具所需JAR文件是Java开发中用于与FTP服务器交互的重要组件,这些JAR库提供了方便的API,使得开发者可以轻松地实现FTP文件传输功能。以下是对这些JAR文件的详细说明: 1. `ant-jakarta-oro-1.6.1.jar`: ...

    java ftp 上传下载,代码。

    - 提供的"WinFtp Server2.0.1特别汉化版"是一个FTP服务器软件,可以在本地计算机上设置FTP服务,用于测试和调试FTP客户端代码。 - 安装并配置WinFtp Server,包括设置用户名、密码、监听端口等,然后启动服务器。 ...

    FTP上传测试工具 java

    在这个场景中,"FTP上传测试工具 java" 提供了一种基于Java语言的解决方案,用于测试FTP功能和验证与客户的FTP通信需求。Java作为一种通用且跨平台的编程语言,提供了丰富的库和API来实现FTP客户端功能。 首先,...

    ftp上传示例java代码

    FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议,广泛应用于各种系统集成和数据迁移...通过学习和实践这个"ftp上传示例java代码",开发者可以熟练地将FTP功能集成到自己的Java应用程序中。

    (转)Java使用Apache FtpServer实现嵌入式FTP服务器

    Java使用Apache FtpServer实现嵌入式FTP服务器是一项常见的任务,尤其在开发集成测试或部署自动化流程时。Apache FtpServer是一个开源项目,它提供了一个轻量级且可嵌入的FTP服务器,允许开发者在Java应用程序中直接...

Global site tag (gtag.js) - Google Analytics